1 1.1 skrll /* Support for the generic parts of most COFF variants, for BFD. 2 1.12 christos Copyright (C) 1990-2026 Free Software Foundation, Inc. 3 1.1 skrll Written by Cygnus Support. 4 1.1 skrll 5 1.1 skrll This file is part of BFD, the Binary File Descriptor library. 6 1.1 skrll 7 1.1 skrll This program is free software; you can redistribute it and/or modify 8 1.1 skrll it under the terms of the GNU General Public License as published by 9 1.1 skrll the Free Software Foundation; either version 3 of the License, or 10 1.1 skrll (at your option) any later version. 11 1.1 skrll 12 1.1 skrll This program is distributed in the hope that it will be useful, 13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 skrll GNU General Public License for more details. 16 1.1 skrll 17 1.1 skrll You should have received a copy of the GNU General Public License 18 1.1 skrll along with this program; if not, write to the Free Software 19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 1.1 skrll MA 02110-1301, USA. */ 21 1.1 skrll 22 1.1 skrll /* Most of this hacked by Steve Chamberlain, 23 1.1 skrll sac (at) cygnus.com. */ 24 1.1 skrll /* 25 1.1 skrll SECTION 26 1.1 skrll coff backends 27 1.1 skrll 28 1.1 skrll BFD supports a number of different flavours of coff format. 29 1.1 skrll The major differences between formats are the sizes and 30 1.1 skrll alignments of fields in structures on disk, and the occasional 31 1.1 skrll extra field. 32 1.1 skrll 33 1.1 skrll Coff in all its varieties is implemented with a few common 34 1.1 skrll files and a number of implementation specific files. For 35 1.7 christos example, the i386 coff format is implemented in the file 36 1.7 christos @file{coff-i386.c}. This file @code{#include}s 37 1.7 christos @file{coff/i386.h} which defines the external structure of the 38 1.7 christos coff format for the i386, and @file{coff/internal.h} which 39 1.7 christos defines the internal structure. @file{coff-i386.c} also 40 1.7 christos defines the relocations used by the i386 coff format 41 1.1 skrll @xref{Relocations}. 42 1.1 skrll 43 1.1 skrll SUBSECTION 44 1.1 skrll Porting to a new version of coff 45 1.1 skrll 46 1.1 skrll The recommended method is to select from the existing 47 1.1 skrll implementations the version of coff which is most like the one 48 1.1 skrll you want to use. For example, we'll say that i386 coff is 49 1.1 skrll the one you select, and that your coff flavour is called foo. 50 1.1 skrll Copy @file{i386coff.c} to @file{foocoff.c}, copy 51 1.1 skrll @file{../include/coff/i386.h} to @file{../include/coff/foo.h}, 52 1.1 skrll and add the lines to @file{targets.c} and @file{Makefile.in} 53 1.1 skrll so that your new back end is used. Alter the shapes of the 54 1.1 skrll structures in @file{../include/coff/foo.h} so that they match 55 1.1 skrll what you need. You will probably also have to add 56 1.1 skrll @code{#ifdef}s to the code in @file{coff/internal.h} and 57 1.1 skrll @file{coffcode.h} if your version of coff is too wild. 58 1.1 skrll 59 1.1 skrll You can verify that your new BFD backend works quite simply by 60 1.1 skrll building @file{objdump} from the @file{binutils} directory, 61 1.1 skrll and making sure that its version of what's going on and your 62 1.1 skrll host system's idea (assuming it has the pretty standard coff 63 1.1 skrll dump utility, usually called @code{att-dump} or just 64 1.1 skrll @code{dump}) are the same. Then clean up your code, and send 65 1.1 skrll what you've done to Cygnus. Then your stuff will be in the 66 1.1 skrll next release, and you won't have to keep integrating it. 67 1.1 skrll 68 1.1 skrll SUBSECTION 69 1.1 skrll How the coff backend works 70 1.1 skrll 71 1.1 skrll SUBSUBSECTION 72 1.1 skrll File layout 73 1.1 skrll 74 1.1 skrll The Coff backend is split into generic routines that are 75 1.1 skrll applicable to any Coff target and routines that are specific 76 1.1 skrll to a particular target. The target-specific routines are 77 1.1 skrll further split into ones which are basically the same for all 78 1.1 skrll Coff targets except that they use the external symbol format 79 1.1 skrll or use different values for certain constants. 80 1.1 skrll 81 1.1 skrll The generic routines are in @file{coffgen.c}. These routines 82 1.1 skrll work for any Coff target. They use some hooks into the target 83 1.1 skrll specific code; the hooks are in a @code{bfd_coff_backend_data} 84 1.1 skrll structure, one of which exists for each target. 85 1.1 skrll 86 1.1 skrll The essentially similar target-specific routines are in 87 1.1 skrll @file{coffcode.h}. This header file includes executable C code. 88 1.1 skrll The various Coff targets first include the appropriate Coff 89 1.1 skrll header file, make any special defines that are needed, and 90 1.1 skrll then include @file{coffcode.h}. 91 1.1 skrll 92 1.1 skrll Some of the Coff targets then also have additional routines in 93 1.1 skrll the target source file itself. 94 1.1 skrll 95 1.1 skrll SUBSUBSECTION 96 1.2 matt Coff long section names 97 1.2 matt 98 1.2 matt In the standard Coff object format, section names are limited to 99 1.2 matt the eight bytes available in the @code{s_name} field of the 100 1.2 matt @code{SCNHDR} section header structure. The format requires the 101 1.2 matt field to be NUL-padded, but not necessarily NUL-terminated, so 102 1.2 matt the longest section names permitted are a full eight characters. 103 1.2 matt 104 1.2 matt The Microsoft PE variants of the Coff object file format add 105 1.2 matt an extension to support the use of long section names. This 106 1.3 christos extension is defined in section 4 of the Microsoft PE/COFF 107 1.2 matt specification (rev 8.1). If a section name is too long to fit 108 1.2 matt into the section header's @code{s_name} field, it is instead 109 1.2 matt placed into the string table, and the @code{s_name} field is 110 1.3 christos filled with a slash ("/") followed by the ASCII decimal 111 1.2 matt representation of the offset of the full name relative to the 112 1.2 matt string table base. 113 1.2 matt 114 1.2 matt Note that this implies that the extension can only be used in object 115 1.2 matt files, as executables do not contain a string table. The standard 116 1.2 matt specifies that long section names from objects emitted into executable 117 1.2 matt images are to be truncated. 118 1.2 matt 119 1.2 matt However, as a GNU extension, BFD can generate executable images 120 1.2 matt that contain a string table and long section names. This 121 1.2 matt would appear to be technically valid, as the standard only says 122 1.2 matt that Coff debugging information is deprecated, not forbidden, 123 1.2 matt and in practice it works, although some tools that parse PE files 124 1.2 matt expecting the MS standard format may become confused; @file{PEview} is 125 1.2 matt one known example. 126 1.2 matt 127 1.3 christos The functionality is supported in BFD by code implemented under 128 1.2 matt the control of the macro @code{COFF_LONG_SECTION_NAMES}. If not 129 1.2 matt defined, the format does not support long section names in any way. 130 1.3 christos If defined, it is used to initialise a flag, 131 1.3 christos @code{_bfd_coff_long_section_names}, and a hook function pointer, 132 1.2 matt @code{_bfd_coff_set_long_section_names}, in the Coff backend data 133 1.2 matt structure. The flag controls the generation of long section names 134 1.2 matt in output BFDs at runtime; if it is false, as it will be by default 135 1.2 matt when generating an executable image, long section names are truncated; 136 1.2 matt if true, the long section names extension is employed. The hook 137 1.10 christos points to a function that allows the value of a copy of the flag 138 1.10 christos in coff object tdata to be altered at runtime, on formats that 139 1.10 christos support long section names at all; on other formats it points 140 1.10 christos to a stub that returns an error indication. 141 1.3 christos 142 1.2 matt With input BFDs, the flag is set according to whether any long section 143 1.2 matt names are detected while reading the section headers. For a completely 144 1.2 matt new BFD, the flag is set to the default for the target format. This 145 1.2 matt information can be used by a client of the BFD library when deciding 146 1.2 matt what output format to generate, and means that a BFD that is opened 147 1.2 matt for read and subsequently converted to a writeable BFD and modified 148 1.2 matt in-place will retain whatever format it had on input. 149 1.2 matt 150 1.2 matt If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is 151 1.2 matt defined to the value "1", then long section names are enabled by 152 1.2 matt default; if it is defined to the value zero, they are disabled by 153 1.2 matt default (but still accepted in input BFDs). The header @file{coffcode.h} 154 1.2 matt defines a macro, @code{COFF_DEFAULT_LONG_SECTION_NAMES}, which is 155 1.2 matt used in the backends to initialise the backend data structure fields 156 1.2 matt appropriately; see the comments for further detail. 157 1.2 matt 158 1.2 matt SUBSUBSECTION 159 1.1 skrll Bit twiddling 160 1.1 skrll 161 1.1 skrll Each flavour of coff supported in BFD has its own header file 162 1.1 skrll describing the external layout of the structures. There is also 163 1.1 skrll an internal description of the coff layout, in 164 1.1 skrll @file{coff/internal.h}. A major function of the 165 1.1 skrll coff backend is swapping the bytes and twiddling the bits to 166 1.1 skrll translate the external form of the structures into the normal 167 1.1 skrll internal form. This is all performed in the 168 1.1 skrll @code{bfd_swap}_@i{thing}_@i{direction} routines. Some 169 1.1 skrll elements are different sizes between different versions of 170 1.1 skrll coff; it is the duty of the coff version specific include file 171 1.1 skrll to override the definitions of various packing routines in 172 1.1 skrll @file{coffcode.h}. E.g., the size of line number entry in coff is 173 1.1 skrll sometimes 16 bits, and sometimes 32 bits. @code{#define}ing 174 1.1 skrll @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the 175 1.1 skrll correct one. No doubt, some day someone will find a version of 176 1.1 skrll coff which has a varying field size not catered to at the 177 1.1 skrll moment. To port BFD, that person will have to add more @code{#defines}. 178 1.1 skrll Three of the bit twiddling routines are exported to 179 1.1 skrll @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in} 180 1.1 skrll and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol 181 1.1 skrll table on its own, but uses BFD to fix things up. More of the 182 1.1 skrll bit twiddlers are exported for @code{gas}; 183 1.1 skrll @code{coff_swap_aux_out}, @code{coff_swap_sym_out}, 184 1.1 skrll @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out}, 185 1.1 skrll @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out}, 186 1.1 skrll @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track 187 1.1 skrll of all the symbol table and reloc drudgery itself, thereby 188 1.1 skrll saving the internal BFD overhead, but uses BFD to swap things 189 1.1 skrll on the way out, making cross ports much safer. Doing so also 190 1.1 skrll allows BFD (and thus the linker) to use the same header files 191 1.1 skrll as @code{gas}, which makes one avenue to disaster disappear. 192 1.1 skrll 193 1.1 skrll SUBSUBSECTION 194 1.1 skrll Symbol reading 195 1.1 skrll 196 1.1 skrll The simple canonical form for symbols used by BFD is not rich 197 1.1 skrll enough to keep all the information available in a coff symbol 198 1.1 skrll table. The back end gets around this problem by keeping the original 199 1.1 skrll symbol table around, "behind the scenes". 200 1.1 skrll 201 1.1 skrll When a symbol table is requested (through a call to 202 1.1 skrll @code{bfd_canonicalize_symtab}), a request gets through to 203 1.1 skrll @code{coff_get_normalized_symtab}. This reads the symbol table from 204 1.1 skrll the coff file and swaps all the structures inside into the 205 1.1 skrll internal form. It also fixes up all the pointers in the table 206 1.1 skrll (represented in the file by offsets from the first symbol in 207 1.1 skrll the table) into physical pointers to elements in the new 208 1.1 skrll internal table. This involves some work since the meanings of 209 1.1 skrll fields change depending upon context: a field that is a 210 1.1 skrll pointer to another structure in the symbol table at one moment 211 1.1 skrll may be the size in bytes of a structure at the next. Another 212 1.1 skrll pass is made over the table. All symbols which mark file names 213 1.1 skrll (<<C_FILE>> symbols) are modified so that the internal 214 1.1 skrll string points to the value in the auxent (the real filename) 215 1.1 skrll rather than the normal text associated with the symbol 216 1.1 skrll (@code{".file"}). 217 1.1 skrll 218 1.1 skrll At this time the symbol names are moved around. Coff stores 219 1.1 skrll all symbols less than nine characters long physically 220 1.1 skrll within the symbol table; longer strings are kept at the end of 221 1.1 skrll the file in the string table. This pass moves all strings 222 1.1 skrll into memory and replaces them with pointers to the strings. 223 1.1 skrll 224 1.1 skrll The symbol table is massaged once again, this time to create 225 1.1 skrll the canonical table used by the BFD application. Each symbol 226 1.1 skrll is inspected in turn, and a decision made (using the 227 1.1 skrll @code{sclass} field) about the various flags to set in the 228 1.1 skrll @code{asymbol}. @xref{Symbols}. The generated canonical table 229 1.1 skrll shares strings with the hidden internal symbol table. 230 1.1 skrll 231 1.1 skrll Any linenumbers are read from the coff file too, and attached 232 1.1 skrll to the symbols which own the functions the linenumbers belong to. 233 1.1 skrll 234 1.1 skrll SUBSUBSECTION 235 1.1 skrll Symbol writing 236 1.1 skrll 237 1.1 skrll Writing a symbol to a coff file which didn't come from a coff 238 1.1 skrll file will lose any debugging information. The @code{asymbol} 239 1.1 skrll structure remembers the BFD from which the symbol was taken, and on 240 1.1 skrll output the back end makes sure that the same destination target as 241 1.1 skrll source target is present. 242 1.1 skrll 243 1.1 skrll When the symbols have come from a coff file then all the 244 1.1 skrll debugging information is preserved. 245 1.1 skrll 246 1.1 skrll Symbol tables are provided for writing to the back end in a 247 1.1 skrll vector of pointers to pointers. This allows applications like 248 1.1 skrll the linker to accumulate and output large symbol tables 249 1.1 skrll without having to do too much byte copying. 250 1.1 skrll 251 1.1 skrll This function runs through the provided symbol table and 252 1.1 skrll patches each symbol marked as a file place holder 253 1.1 skrll (@code{C_FILE}) to point to the next file place holder in the 254 1.1 skrll list. It also marks each @code{offset} field in the list with 255 1.1 skrll the offset from the first symbol of the current symbol. 256 1.1 skrll 257 1.1 skrll Another function of this procedure is to turn the canonical 258 1.1 skrll value form of BFD into the form used by coff. Internally, BFD 259 1.1 skrll expects symbol values to be offsets from a section base; so a 260 1.1 skrll symbol physically at 0x120, but in a section starting at 261 1.1 skrll 0x100, would have the value 0x20. Coff expects symbols to 262 1.1 skrll contain their final value, so symbols have their values 263 1.1 skrll changed at this point to reflect their sum with their owning 264 1.1 skrll section. This transformation uses the 265 1.1 skrll <<output_section>> field of the @code{asymbol}'s 266 1.1 skrll @code{asection} @xref{Sections}. 267 1.1 skrll 268 1.1 skrll o <<coff_mangle_symbols>> 269 1.1 skrll 270 1.1 skrll This routine runs though the provided symbol table and uses 271 1.1 skrll the offsets generated by the previous pass and the pointers 272 1.1 skrll generated when the symbol table was read in to create the 273 1.1 skrll structured hierarchy required by coff. It changes each pointer 274 1.1 skrll to a symbol into the index into the symbol table of the asymbol. 275 1.1 skrll 276 1.1 skrll o <<coff_write_symbols>> 277 1.1 skrll 278 1.1 skrll This routine runs through the symbol table and patches up the 279 1.1 skrll symbols from their internal form into the coff way, calls the 280 1.1 skrll bit twiddlers, and writes out the table to the file. 281 1.1 skrll 282 1.1 skrll */ 283 1.1 skrll 284 1.1 skrll /* 285 1.1 skrll INTERNAL_DEFINITION 286 1.1 skrll coff_symbol_type 287 1.1 skrll 288 1.1 skrll DESCRIPTION 289 1.1 skrll The hidden information for an <<asymbol>> is described in a 290 1.1 skrll <<combined_entry_type>>: 291 1.1 skrll 292 1.1 skrll CODE_FRAGMENT 293 1.1 skrll .typedef struct coff_ptr_struct 294 1.1 skrll .{ 295 1.1 skrll . {* Remembers the offset from the first symbol in the file for 296 1.10 christos . this symbol. Generated by coff_renumber_symbols. *} 297 1.1 skrll . unsigned int offset; 298 1.1 skrll . 299 1.10 christos . {* Selects between the elements of the union below. *} 300 1.10 christos . unsigned int is_sym : 1; 301 1.1 skrll . 302 1.10 christos . {* Selects between the elements of the x_sym.x_tagndx union. If set, 303 1.10 christos . p is valid and the field will be renumbered. *} 304 1.1 skrll . unsigned int fix_tag : 1; 305 1.1 skrll . 306 1.10 christos . {* Selects between the elements of the x_sym.x_fcnary.x_fcn.x_endndx 307 1.10 christos . union. If set, p is valid and the field will be renumbered. *} 308 1.1 skrll . unsigned int fix_end : 1; 309 1.1 skrll . 310 1.10 christos . {* Selects between the elements of the x_csect.x_scnlen union. If set, 311 1.10 christos . p is valid and the field will be renumbered. *} 312 1.1 skrll . unsigned int fix_scnlen : 1; 313 1.1 skrll . 314 1.10 christos . {* If set, u.syment.n_value contains a pointer to a symbol. The final 315 1.10 christos . value will be the offset field. Used for XCOFF C_BSTAT symbols. *} 316 1.10 christos . unsigned int fix_value : 1; 317 1.10 christos . 318 1.10 christos . {* If set, u.syment.n_value is an index into the line number entries. 319 1.10 christos . Used for XCOFF C_BINCL/C_EINCL symbols. *} 320 1.1 skrll . unsigned int fix_line : 1; 321 1.1 skrll . 322 1.1 skrll . {* The container for the symbol structure as read and translated 323 1.3 christos . from the file. *} 324 1.1 skrll . union 325 1.1 skrll . { 326 1.1 skrll . union internal_auxent auxent; 327 1.1 skrll . struct internal_syment syment; 328 1.1 skrll . } u; 329 1.3 christos . 330 1.9 christos . {* An extra pointer which can used by format based on COFF (like XCOFF) 331 1.9 christos . to provide extra information to their backend. *} 332 1.9 christos . void *extrap; 333 1.1 skrll .} combined_entry_type; 334 1.1 skrll . 335 1.1 skrll .{* Each canonical asymbol really looks like this: *} 336 1.1 skrll . 337 1.1 skrll .typedef struct coff_symbol_struct 338 1.1 skrll .{ 339 1.1 skrll . {* The actual symbol which the rest of BFD works with *} 340 1.1 skrll . asymbol symbol; 341 1.1 skrll . 342 1.1 skrll . {* A pointer to the hidden information for this symbol *} 343 1.1 skrll . combined_entry_type *native; 344 1.1 skrll . 345 1.1 skrll . {* A pointer to the linenumber information for this symbol *} 346 1.1 skrll . struct lineno_cache_entry *lineno; 347 1.1 skrll . 348 1.1 skrll . {* Have the line numbers been relocated yet ? *} 349 1.9 christos . bool done_lineno; 350 1.1 skrll .} coff_symbol_type; 351 1.10 christos . 352 1.1 skrll */ 353 1.1 skrll 354 1.2 matt #include "libiberty.h" 355 1.10 christos #include <string.h> 356 1.2 matt 357 1.1 skrll #ifdef COFF_WITH_PE 358 1.1 skrll #include "peicode.h" 359 1.1 skrll #else 360 1.1 skrll #include "coffswap.h" 361 1.1 skrll #endif 362 1.1 skrll 363 1.1 skrll #define STRING_SIZE_SIZE 4 364 1.1 skrll 365 1.1 skrll #define DOT_DEBUG ".debug" 366 1.3 christos #define DOT_ZDEBUG ".zdebug" 367 1.1 skrll #define GNU_LINKONCE_WI ".gnu.linkonce.wi." 368 1.2 matt #define GNU_LINKONCE_WT ".gnu.linkonce.wt." 369 1.2 matt #define DOT_RELOC ".reloc" 370 1.2 matt 371 1.9 christos #if defined(COFF_WITH_PE) || defined(COFF_GO32_EXE) || defined(COFF_GO32) 372 1.9 christos # define COFF_WITH_EXTENDED_RELOC_COUNTER 373 1.9 christos #endif 374 1.9 christos 375 1.2 matt #if defined (COFF_LONG_SECTION_NAMES) 376 1.2 matt /* Needed to expand the inputs to BLANKOR1TOODD. */ 377 1.2 matt #define COFFLONGSECTIONCATHELPER(x,y) x ## y 378 1.2 matt /* If the input macro Y is blank or '1', return an odd number; if it is 379 1.2 matt '0', return an even number. Result undefined in all other cases. */ 380 1.6 christos #define BLANKOR1TOODD(y) COFFLONGSECTIONCATHELPER(1,y) 381 1.2 matt /* Defined to numerical 0 or 1 according to whether generation of long 382 1.2 matt section names is disabled or enabled by default. */ 383 1.2 matt #define COFF_ENABLE_LONG_SECTION_NAMES (BLANKOR1TOODD(COFF_LONG_SECTION_NAMES) & 1) 384 1.2 matt /* Where long section names are supported, we allow them to be enabled 385 1.2 matt and disabled at runtime, so select an appropriate hook function for 386 1.2 matt _bfd_coff_set_long_section_names. */ 387 1.2 matt #define COFF_LONG_SECTION_NAMES_SETTER bfd_coff_set_long_section_names_allowed 388 1.2 matt #else /* !defined (COFF_LONG_SECTION_NAMES) */ 389 1.2 matt /* If long section names are not supported, this stub disallows any 390 1.2 matt attempt to enable them at run-time. */ 391 1.2 matt #define COFF_LONG_SECTION_NAMES_SETTER bfd_coff_set_long_section_names_disallowed 392 1.2 matt #endif /* defined (COFF_LONG_SECTION_NAMES) */ 393 1.2 matt 394 1.2 matt /* Define a macro that can be used to initialise both the fields relating 395 1.2 matt to long section names in the backend data struct simultaneously. */ 396 1.2 matt #if COFF_ENABLE_LONG_SECTION_NAMES 397 1.9 christos #define COFF_DEFAULT_LONG_SECTION_NAMES (true), COFF_LONG_SECTION_NAMES_SETTER 398 1.2 matt #else /* !COFF_ENABLE_LONG_SECTION_NAMES */ 399 1.9 christos #define COFF_DEFAULT_LONG_SECTION_NAMES (false), COFF_LONG_SECTION_NAMES_SETTER 400 1.2 matt #endif /* COFF_ENABLE_LONG_SECTION_NAMES */ 401 1.1 skrll 402 1.1 skrll static enum coff_symbol_classification coff_classify_symbol 403 1.1 skrll (bfd *, struct internal_syment *); 404 1.1 skrll 405 1.1 skrll /* void warning(); */ 407 1.2 matt 408 1.9 christos #if defined (COFF_LONG_SECTION_NAMES) 409 1.2 matt static bool 410 1.2 matt bfd_coff_set_long_section_names_allowed (bfd *abfd, int enable) 411 1.10 christos { 412 1.9 christos bfd_coff_long_section_names (abfd) = enable; 413 1.2 matt return true; 414 1.2 matt } 415 1.9 christos #else /* !defined (COFF_LONG_SECTION_NAMES) */ 416 1.10 christos static bool 417 1.10 christos bfd_coff_set_long_section_names_disallowed (bfd *abfd ATTRIBUTE_UNUSED, 418 1.2 matt int enable ATTRIBUTE_UNUSED) 419 1.9 christos { 420 1.2 matt return false; 421 1.2 matt } 422 1.2 matt #endif /* defined (COFF_LONG_SECTION_NAMES) */ 423 1.1 skrll 424 1.1 skrll /* Return a word with STYP_* (scnhdr.s_flags) flags set to represent 425 1.1 skrll the incoming SEC_* flags. The inverse of this function is 426 1.1 skrll styp_to_sec_flags(). NOTE: If you add to/change this routine, you 427 1.1 skrll should probably mirror the changes in styp_to_sec_flags(). */ 428 1.1 skrll 429 1.1 skrll #ifndef COFF_WITH_PE 430 1.1 skrll 431 1.1 skrll /* Macros for setting debugging flags. */ 432 1.1 skrll 433 1.1 skrll #ifdef STYP_DEBUG 434 1.1 skrll #define STYP_XCOFF_DEBUG STYP_DEBUG 435 1.1 skrll #else 436 1.1 skrll #define STYP_XCOFF_DEBUG STYP_INFO 437 1.1 skrll #endif 438 1.1 skrll 439 1.1 skrll #ifdef COFF_ALIGN_IN_S_FLAGS 440 1.1 skrll #define STYP_DEBUG_INFO STYP_DSECT 441 1.1 skrll #else 442 1.1 skrll #define STYP_DEBUG_INFO STYP_INFO 443 1.1 skrll #endif 444 1.1 skrll 445 1.1 skrll static long 446 1.1 skrll sec_to_styp_flags (const char *sec_name, flagword sec_flags) 447 1.1 skrll { 448 1.1 skrll long styp_flags = 0; 449 1.1 skrll 450 1.1 skrll if (!strcmp (sec_name, _TEXT)) 451 1.1 skrll { 452 1.1 skrll styp_flags = STYP_TEXT; 453 1.1 skrll } 454 1.1 skrll else if (!strcmp (sec_name, _DATA)) 455 1.1 skrll { 456 1.1 skrll styp_flags = STYP_DATA; 457 1.1 skrll } 458 1.1 skrll else if (!strcmp (sec_name, _BSS)) 459 1.1 skrll { 460 1.1 skrll styp_flags = STYP_BSS; 461 1.1 skrll #ifdef _COMMENT 462 1.1 skrll } 463 1.1 skrll else if (!strcmp (sec_name, _COMMENT)) 464 1.1 skrll { 465 1.1 skrll styp_flags = STYP_INFO; 466 1.1 skrll #endif /* _COMMENT */ 467 1.1 skrll #ifdef _LIB 468 1.1 skrll } 469 1.1 skrll else if (!strcmp (sec_name, _LIB)) 470 1.1 skrll { 471 1.1 skrll styp_flags = STYP_LIB; 472 1.1 skrll #endif /* _LIB */ 473 1.1 skrll #ifdef _LIT 474 1.1 skrll } 475 1.1 skrll else if (!strcmp (sec_name, _LIT)) 476 1.1 skrll { 477 1.1 skrll styp_flags = STYP_LIT; 478 1.1 skrll #endif /* _LIT */ 479 1.9 christos } 480 1.9 christos else if (startswith (sec_name, DOT_DEBUG) 481 1.1 skrll || startswith (sec_name, DOT_ZDEBUG)) 482 1.1 skrll { 483 1.1 skrll /* Handle the XCOFF debug section and DWARF2 debug sections. */ 484 1.1 skrll if (!sec_name[6]) 485 1.1 skrll styp_flags = STYP_XCOFF_DEBUG; 486 1.1 skrll else 487 1.1 skrll styp_flags = STYP_DEBUG_INFO; 488 1.9 christos } 489 1.1 skrll else if (startswith (sec_name, ".stab")) 490 1.1 skrll { 491 1.1 skrll styp_flags = STYP_DEBUG_INFO; 492 1.1 skrll } 493 1.9 christos #ifdef COFF_LONG_SECTION_NAMES 494 1.9 christos else if (startswith (sec_name, GNU_LINKONCE_WI) 495 1.1 skrll || startswith (sec_name, GNU_LINKONCE_WT)) 496 1.1 skrll { 497 1.1 skrll styp_flags = STYP_DEBUG_INFO; 498 1.1 skrll } 499 1.1 skrll #endif 500 1.9 christos #ifdef RS6000COFF_C 501 1.9 christos else if (!strcmp (sec_name, _TDATA)) 502 1.9 christos { 503 1.9 christos styp_flags = STYP_TDATA; 504 1.9 christos } 505 1.9 christos else if (!strcmp (sec_name, _TBSS)) 506 1.9 christos { 507 1.9 christos styp_flags = STYP_TBSS; 508 1.1 skrll } 509 1.1 skrll else if (!strcmp (sec_name, _PAD)) 510 1.1 skrll { 511 1.1 skrll styp_flags = STYP_PAD; 512 1.1 skrll } 513 1.1 skrll else if (!strcmp (sec_name, _LOADER)) 514 1.1 skrll { 515 1.1 skrll styp_flags = STYP_LOADER; 516 1.1 skrll } 517 1.1 skrll else if (!strcmp (sec_name, _EXCEPT)) 518 1.1 skrll { 519 1.1 skrll styp_flags = STYP_EXCEPT; 520 1.1 skrll } 521 1.1 skrll else if (!strcmp (sec_name, _TYPCHK)) 522 1.1 skrll { 523 1.1 skrll styp_flags = STYP_TYPCHK; 524 1.2 matt } 525 1.2 matt else if (sec_flags & SEC_DEBUGGING) 526 1.2 matt { 527 1.2 matt int i; 528 1.2 matt 529 1.9 christos for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++) 530 1.6 christos if (!strcmp (sec_name, xcoff_dwsect_names[i].xcoff_name)) 531 1.6 christos { 532 1.6 christos styp_flags = STYP_DWARF | xcoff_dwsect_names[i].flag; 533 1.6 christos break; 534 1.2 matt } 535 1.1 skrll } 536 1.1 skrll #endif 537 1.1 skrll /* Try and figure out what it should be */ 538 1.1 skrll else if (sec_flags & SEC_CODE) 539 1.1 skrll { 540 1.1 skrll styp_flags = STYP_TEXT; 541 1.1 skrll } 542 1.1 skrll else if (sec_flags & SEC_DATA) 543 1.1 skrll { 544 1.1 skrll styp_flags = STYP_DATA; 545 1.1 skrll } 546 1.1 skrll else if (sec_flags & SEC_READONLY) 547 1.1 skrll { 548 1.1 skrll #ifdef STYP_LIT /* 29k readonly text/data section */ 549 1.1 skrll styp_flags = STYP_LIT; 550 1.1 skrll #else 551 1.1 skrll styp_flags = STYP_TEXT; 552 1.1 skrll #endif /* STYP_LIT */ 553 1.1 skrll } 554 1.1 skrll else if (sec_flags & SEC_LOAD) 555 1.1 skrll { 556 1.1 skrll styp_flags = STYP_TEXT; 557 1.1 skrll } 558 1.1 skrll else if (sec_flags & SEC_ALLOC) 559 1.1 skrll { 560 1.1 skrll styp_flags = STYP_BSS; 561 1.1 skrll } 562 1.1 skrll 563 1.1 skrll #ifdef STYP_CLINK 564 1.1 skrll if (sec_flags & SEC_TIC54X_CLINK) 565 1.1 skrll styp_flags |= STYP_CLINK; 566 1.1 skrll #endif 567 1.1 skrll 568 1.1 skrll #ifdef STYP_BLOCK 569 1.1 skrll if (sec_flags & SEC_TIC54X_BLOCK) 570 1.1 skrll styp_flags |= STYP_BLOCK; 571 1.1 skrll #endif 572 1.1 skrll 573 1.1 skrll #ifdef STYP_NOLOAD 574 1.1 skrll if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0) 575 1.1 skrll styp_flags |= STYP_NOLOAD; 576 1.1 skrll #endif 577 1.1 skrll 578 1.1 skrll return styp_flags; 579 1.1 skrll } 580 1.1 skrll 581 1.1 skrll #else /* COFF_WITH_PE */ 582 1.1 skrll 583 1.1 skrll /* The PE version; see above for the general comments. The non-PE 584 1.1 skrll case seems to be more guessing, and breaks PE format; specifically, 585 1.1 skrll .rdata is readonly, but it sure ain't text. Really, all this 586 1.1 skrll should be set up properly in gas (or whatever assembler is in use), 587 1.1 skrll and honor whatever objcopy/strip, etc. sent us as input. */ 588 1.1 skrll 589 1.1 skrll static long 590 1.1 skrll sec_to_styp_flags (const char *sec_name, flagword sec_flags) 591 1.1 skrll { 592 1.9 christos long styp_flags = 0; 593 1.2 matt bool is_dbg = false; 594 1.9 christos 595 1.9 christos if (startswith (sec_name, DOT_DEBUG) 596 1.2 matt || startswith (sec_name, DOT_ZDEBUG) 597 1.9 christos #ifdef COFF_LONG_SECTION_NAMES 598 1.9 christos || startswith (sec_name, GNU_LINKONCE_WI) 599 1.2 matt || startswith (sec_name, GNU_LINKONCE_WT) 600 1.9 christos #endif 601 1.9 christos || startswith (sec_name, ".stab")) 602 1.1 skrll is_dbg = true; 603 1.1 skrll 604 1.1 skrll /* caution: there are at least three groups of symbols that have 605 1.1 skrll very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*. 606 1.1 skrll SEC_* are the BFD internal flags, used for generic BFD 607 1.1 skrll information. STYP_* are the COFF section flags which appear in 608 1.1 skrll COFF files. IMAGE_SCN_* are the PE section flags which appear in 609 1.1 skrll PE files. The STYP_* flags and the IMAGE_SCN_* flags overlap, 610 1.1 skrll but there are more IMAGE_SCN_* flags. */ 611 1.1 skrll 612 1.2 matt /* FIXME: There is no gas syntax to specify the debug section flag. */ 613 1.2 matt if (is_dbg) 614 1.2 matt { 615 1.6 christos sec_flags &= (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD 616 1.6 christos | SEC_LINK_DUPLICATES_SAME_CONTENTS 617 1.2 matt | SEC_LINK_DUPLICATES_SAME_SIZE); 618 1.2 matt sec_flags |= SEC_DEBUGGING | SEC_READONLY; 619 1.1 skrll } 620 1.1 skrll 621 1.1 skrll /* skip LOAD */ 622 1.1 skrll /* READONLY later */ 623 1.1 skrll /* skip RELOC */ 624 1.1 skrll if ((sec_flags & SEC_CODE) != 0) 625 1.2 matt styp_flags |= IMAGE_SCN_CNT_CODE; 626 1.1 skrll if ((sec_flags & (SEC_DATA | SEC_DEBUGGING)) != 0) 627 1.1 skrll styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA; 628 1.1 skrll if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0) 629 1.1 skrll styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */ 630 1.1 skrll /* skip ROM */ 631 1.1 skrll /* skip constRUCTOR */ 632 1.9 christos /* skip CONTENTS */ 633 1.9 christos #ifndef COFF_IMAGE_WITH_PE 634 1.9 christos /* I don't think any of the IMAGE_SCN_LNK_* flags set below should be set 635 1.9 christos when the output is PE. Only object files should have them, for the linker 636 1.1 skrll to consume. */ 637 1.1 skrll if ((sec_flags & SEC_IS_COMMON) != 0) 638 1.9 christos styp_flags |= IMAGE_SCN_LNK_COMDAT; 639 1.1 skrll #endif 640 1.1 skrll if ((sec_flags & SEC_DEBUGGING) != 0) 641 1.9 christos styp_flags |= IMAGE_SCN_MEM_DISCARDABLE; 642 1.9 christos if ((sec_flags & (SEC_EXCLUDE | SEC_NEVER_LOAD)) != 0 && !is_dbg) 643 1.9 christos #ifdef COFF_IMAGE_WITH_PE 644 1.9 christos styp_flags |= IMAGE_SCN_MEM_DISCARDABLE; 645 1.1 skrll #else 646 1.9 christos styp_flags |= IMAGE_SCN_LNK_REMOVE; 647 1.1 skrll #endif 648 1.1 skrll /* skip IN_MEMORY */ 649 1.9 christos /* skip SORT */ 650 1.1 skrll #ifndef COFF_IMAGE_WITH_PE 651 1.1 skrll if (sec_flags & SEC_LINK_ONCE) 652 1.2 matt styp_flags |= IMAGE_SCN_LNK_COMDAT; 653 1.2 matt if ((sec_flags 654 1.6 christos & (SEC_LINK_DUPLICATES_DISCARD | SEC_LINK_DUPLICATES_SAME_CONTENTS 655 1.2 matt | SEC_LINK_DUPLICATES_SAME_SIZE)) != 0) 656 1.9 christos styp_flags |= IMAGE_SCN_LNK_COMDAT; 657 1.3 christos #endif 658 1.1 skrll 659 1.1 skrll /* skip LINKER_CREATED */ 660 1.2 matt 661 1.2 matt if ((sec_flags & SEC_COFF_NOREAD) == 0) 662 1.2 matt styp_flags |= IMAGE_SCN_MEM_READ; /* Invert NOREAD for read. */ 663 1.2 matt if ((sec_flags & SEC_READONLY) == 0) 664 1.2 matt styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write. */ 665 1.2 matt if (sec_flags & SEC_CODE) 666 1.2 matt styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE. */ 667 1.2 matt if (sec_flags & SEC_COFF_SHARED) 668 1.1 skrll styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful. */ 669 1.1 skrll 670 1.1 skrll return styp_flags; 671 1.1 skrll } 672 1.1 skrll 673 1.1 skrll #endif /* COFF_WITH_PE */ 674 1.1 skrll 675 1.1 skrll /* Return a word with SEC_* flags set to represent the incoming STYP_* 676 1.1 skrll flags (from scnhdr.s_flags). The inverse of this function is 677 1.1 skrll sec_to_styp_flags(). NOTE: If you add to/change this routine, you 678 1.1 skrll should probably mirror the changes in sec_to_styp_flags(). */ 679 1.1 skrll 680 1.1 skrll #ifndef COFF_WITH_PE 681 1.9 christos 682 1.9 christos static bool 683 1.1 skrll styp_to_sec_flags (bfd *abfd, 684 1.1 skrll void * hdr, 685 1.1 skrll const char *name, 686 1.1 skrll asection *section ATTRIBUTE_UNUSED, 687 1.1 skrll flagword *flags_ptr) 688 1.1 skrll { 689 1.9 christos struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; 690 1.1 skrll unsigned long styp_flags = internal_s->s_flags; 691 1.1 skrll flagword sec_flags = 0; 692 1.1 skrll 693 1.1 skrll #ifdef STYP_BLOCK 694 1.1 skrll if (styp_flags & STYP_BLOCK) 695 1.1 skrll sec_flags |= SEC_TIC54X_BLOCK; 696 1.1 skrll #endif 697 1.1 skrll 698 1.1 skrll #ifdef STYP_CLINK 699 1.1 skrll if (styp_flags & STYP_CLINK) 700 1.1 skrll sec_flags |= SEC_TIC54X_CLINK; 701 1.1 skrll #endif 702 1.1 skrll 703 1.1 skrll #ifdef STYP_NOLOAD 704 1.1 skrll if (styp_flags & STYP_NOLOAD) 705 1.1 skrll sec_flags |= SEC_NEVER_LOAD; 706 1.1 skrll #endif /* STYP_NOLOAD */ 707 1.1 skrll 708 1.1 skrll /* For 386 COFF, at least, an unloadable text or data section is 709 1.1 skrll actually a shared library section. */ 710 1.1 skrll if (styp_flags & STYP_TEXT) 711 1.1 skrll { 712 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 713 1.1 skrll sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; 714 1.1 skrll else 715 1.1 skrll sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; 716 1.1 skrll } 717 1.1 skrll else if (styp_flags & STYP_DATA) 718 1.1 skrll { 719 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 720 1.1 skrll sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; 721 1.1 skrll else 722 1.1 skrll sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; 723 1.1 skrll } 724 1.1 skrll else if (styp_flags & STYP_BSS) 725 1.1 skrll { 726 1.1 skrll #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY 727 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 728 1.1 skrll sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY; 729 1.1 skrll else 730 1.1 skrll #endif 731 1.1 skrll sec_flags |= SEC_ALLOC; 732 1.1 skrll } 733 1.1 skrll else if (styp_flags & STYP_INFO) 734 1.1 skrll { 735 1.1 skrll /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is 736 1.1 skrll defined. coff_compute_section_file_positions uses 737 1.1 skrll COFF_PAGE_SIZE to ensure that the low order bits of the 738 1.1 skrll section VMA and the file offset match. If we don't know 739 1.1 skrll COFF_PAGE_SIZE, we can't ensure the correct correspondence, 740 1.1 skrll and demand page loading of the file will fail. */ 741 1.1 skrll #if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS) 742 1.1 skrll sec_flags |= SEC_DEBUGGING; 743 1.1 skrll #endif 744 1.1 skrll } 745 1.1 skrll else if (styp_flags & STYP_PAD) 746 1.2 matt sec_flags = 0; 747 1.9 christos #ifdef RS6000COFF_C 748 1.9 christos else if (styp_flags & STYP_TDATA) 749 1.9 christos { 750 1.9 christos if (sec_flags & SEC_NEVER_LOAD) 751 1.9 christos sec_flags |= SEC_DATA | SEC_THREAD_LOCAL | SEC_COFF_SHARED_LIBRARY; 752 1.9 christos else 753 1.9 christos sec_flags |= SEC_DATA | SEC_THREAD_LOCAL | SEC_LOAD | SEC_ALLOC; 754 1.9 christos } 755 1.9 christos else if (styp_flags & STYP_TBSS) 756 1.9 christos { 757 1.9 christos #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY 758 1.9 christos if (sec_flags & SEC_NEVER_LOAD) 759 1.9 christos sec_flags |= SEC_ALLOC | SEC_THREAD_LOCAL | SEC_COFF_SHARED_LIBRARY; 760 1.9 christos else 761 1.9 christos #endif 762 1.9 christos sec_flags |= SEC_ALLOC | SEC_THREAD_LOCAL; 763 1.3 christos } 764 1.3 christos else if (styp_flags & STYP_EXCEPT) 765 1.3 christos sec_flags |= SEC_LOAD; 766 1.3 christos else if (styp_flags & STYP_LOADER) 767 1.3 christos sec_flags |= SEC_LOAD; 768 1.3 christos else if (styp_flags & STYP_TYPCHK) 769 1.2 matt sec_flags |= SEC_LOAD; 770 1.2 matt else if (styp_flags & STYP_DWARF) 771 1.2 matt sec_flags |= SEC_DEBUGGING; 772 1.1 skrll #endif 773 1.1 skrll else if (strcmp (name, _TEXT) == 0) 774 1.1 skrll { 775 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 776 1.1 skrll sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; 777 1.1 skrll else 778 1.1 skrll sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; 779 1.1 skrll } 780 1.1 skrll else if (strcmp (name, _DATA) == 0) 781 1.1 skrll { 782 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 783 1.1 skrll sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; 784 1.1 skrll else 785 1.1 skrll sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; 786 1.1 skrll } 787 1.1 skrll else if (strcmp (name, _BSS) == 0) 788 1.1 skrll { 789 1.1 skrll #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY 790 1.1 skrll if (sec_flags & SEC_NEVER_LOAD) 791 1.1 skrll sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY; 792 1.1 skrll else 793 1.1 skrll #endif 794 1.1 skrll sec_flags |= SEC_ALLOC; 795 1.9 christos } 796 1.9 christos else if (startswith (name, DOT_DEBUG) 797 1.1 skrll || startswith (name, DOT_ZDEBUG) 798 1.1 skrll #ifdef _COMMENT 799 1.1 skrll || strcmp (name, _COMMENT) == 0 800 1.1 skrll #endif 801 1.9 christos #ifdef COFF_LONG_SECTION_NAMES 802 1.9 christos || startswith (name, GNU_LINKONCE_WI) 803 1.1 skrll || startswith (name, GNU_LINKONCE_WT) 804 1.9 christos #endif 805 1.1 skrll || startswith (name, ".stab")) 806 1.1 skrll { 807 1.1 skrll #ifdef COFF_PAGE_SIZE 808 1.1 skrll sec_flags |= SEC_DEBUGGING; 809 1.1 skrll #endif 810 1.1 skrll } 811 1.1 skrll #ifdef _LIB 812 1.1 skrll else if (strcmp (name, _LIB) == 0) 813 1.1 skrll ; 814 1.1 skrll #endif 815 1.1 skrll #ifdef _LIT 816 1.1 skrll else if (strcmp (name, _LIT) == 0) 817 1.1 skrll sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY; 818 1.1 skrll #endif 819 1.1 skrll else 820 1.1 skrll sec_flags |= SEC_ALLOC | SEC_LOAD; 821 1.1 skrll 822 1.1 skrll #ifdef STYP_LIT /* A29k readonly text/data section type. */ 823 1.1 skrll if ((styp_flags & STYP_LIT) == STYP_LIT) 824 1.1 skrll sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY); 825 1.1 skrll #endif /* STYP_LIT */ 826 1.1 skrll 827 1.1 skrll #ifdef STYP_OTHER_LOAD /* Other loaded sections. */ 828 1.1 skrll if (styp_flags & STYP_OTHER_LOAD) 829 1.1 skrll sec_flags = (SEC_LOAD | SEC_ALLOC); 830 1.1 skrll #endif /* STYP_SDATA */ 831 1.9 christos 832 1.9 christos if ((bfd_applicable_section_flags (abfd) & SEC_SMALL_DATA) != 0 833 1.9 christos && (startswith (name, ".sbss") 834 1.9 christos || startswith (name, ".sdata"))) 835 1.9 christos sec_flags |= SEC_SMALL_DATA; 836 1.1 skrll 837 1.1 skrll #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE) 838 1.1 skrll /* As a GNU extension, if the name begins with .gnu.linkonce, we 839 1.1 skrll only link a single copy of the section. This is used to support 840 1.1 skrll g++. g++ will emit each template expansion in its own section. 841 1.1 skrll The symbols will be defined as weak, so that multiple definitions 842 1.1 skrll are permitted. The GNU linker extension is to actually discard 843 1.9 christos all but one of the sections. */ 844 1.1 skrll if (startswith (name, ".gnu.linkonce")) 845 1.1 skrll sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; 846 1.1 skrll #endif 847 1.1 skrll 848 1.9 christos if (flags_ptr == NULL) 849 1.1 skrll return false; 850 1.1 skrll 851 1.9 christos * flags_ptr = sec_flags; 852 1.1 skrll return true; 853 1.1 skrll } 854 1.1 skrll 855 1.1 skrll #else /* COFF_WITH_PE */ 856 1.10 christos 857 1.10 christos static hashval_t 858 1.10 christos comdat_hashf (const void *entry) 859 1.10 christos { 860 1.10 christos const struct comdat_hash_entry *fe = entry; 861 1.10 christos return fe->target_index; 862 1.10 christos } 863 1.10 christos 864 1.10 christos static int 865 1.10 christos comdat_eqf (const void *e1, const void *e2) 866 1.10 christos { 867 1.10 christos const struct comdat_hash_entry *fe1 = e1; 868 1.10 christos const struct comdat_hash_entry *fe2 = e2; 869 1.10 christos return fe1->target_index == fe2->target_index; 870 1.10 christos } 871 1.10 christos 872 1.10 christos static void 873 1.10 christos comdat_delf (void *ent) 874 1.10 christos { 875 1.10 christos struct comdat_hash_entry *e = ent; 876 1.10 christos free (e->comdat_name); 877 1.10 christos free (e->symname); 878 1.10 christos free (e); 879 1.10 christos } 880 1.10 christos 881 1.10 christos static struct comdat_hash_entry * 882 1.10 christos find_flags (htab_t comdat_hash, int target_index) 883 1.10 christos { 884 1.10 christos struct comdat_hash_entry needle; 885 1.10 christos needle.target_index = target_index; 886 1.10 christos 887 1.10 christos return htab_find (comdat_hash, &needle); 888 1.10 christos } 889 1.10 christos 890 1.10 christos static bool 891 1.1 skrll fill_comdat_hash (bfd *abfd) 892 1.1 skrll { 893 1.1 skrll bfd_byte *esymstart, *esym, *esymend; 894 1.10 christos 895 1.10 christos /* Unfortunately, the PE format stores essential information in the 896 1.10 christos symbol table, of all places. We need to extract that information 897 1.10 christos now, so that objdump and the linker will know how to handle the 898 1.10 christos section without worrying about the symbols. We can't call 899 1.1 skrll slurp_symtab, because the linker doesn't want the swapped symbols. */ 900 1.1 skrll 901 1.1 skrll /* COMDAT sections are special. The first symbol is the section 902 1.10 christos symbol, which tells what kind of COMDAT section it is. The 903 1.10 christos second symbol is the "comdat symbol" - the one with the unique 904 1.10 christos name. GNU uses the section symbol for the unique name; MS uses 905 1.10 christos ".text" for every comdat section. Sigh. - DJ. */ 906 1.10 christos 907 1.10 christos /* This is not mirrored in sec_to_styp_flags(), but there doesn't 908 1.1 skrll seem to be a need to, either, and it would at best be rather messy. */ 909 1.1 skrll 910 1.10 christos if (! _bfd_coff_get_external_symbols (abfd)) 911 1.1 skrll return true; 912 1.12 christos 913 1.12 christos esymstart = esym = obj_coff_external_syms (abfd); 914 1.12 christos if (esym == NULL) 915 1.1 skrll return true; 916 1.1 skrll esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd); 917 1.10 christos 918 1.10 christos for (struct internal_syment isym; 919 1.10 christos esym < esymend; 920 1.1 skrll esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd)) 921 1.1 skrll { 922 1.1 skrll char buf[SYMNMLEN + 1]; 923 1.10 christos const char *symname; 924 1.1 skrll flagword sec_flags = SEC_LINK_ONCE; 925 1.10 christos 926 1.1 skrll bfd_coff_swap_sym_in (abfd, esym, &isym); 927 1.10 christos 928 1.10 christos /* According to the MSVC documentation, the first TWO entries 929 1.10 christos with the section # are both of interest to us. The first one 930 1.10 christos is the "section symbol" (section name). The second is the 931 1.10 christos comdat symbol name. Here, we've found the first qualifying 932 1.1 skrll entry; we distinguish it from the second with a state flag. 933 1.10 christos 934 1.10 christos In the case of gas-generated (at least until that is fixed) 935 1.10 christos .o files, it isn't necessarily the second one. It may be 936 1.1 skrll some other later symbol. 937 1.10 christos 938 1.10 christos Since gas also doesn't follow MS conventions and emits the 939 1.10 christos section similar to .text$<name>, where <something> is the 940 1.1 skrll name we're looking for, we distinguish the two as follows: 941 1.10 christos 942 1.10 christos If the section name is simply a section name (no $) we 943 1.10 christos presume it's MS-generated, and look at precisely the second 944 1.10 christos symbol for the comdat name. If the section name has a $, we 945 1.10 christos assume it's gas-generated, and look for <something> (whatever 946 1.1 skrll follows the $) as the comdat symbol. */ 947 1.10 christos 948 1.10 christos /* All 3 branches use this. */ 949 1.1 skrll symname = _bfd_coff_internal_syment_name (abfd, &isym, buf); 950 1.10 christos 951 1.10 christos /* PR 17512 file: 078-11867-0.004 */ 952 1.10 christos if (symname == NULL) 953 1.10 christos { 954 1.10 christos _bfd_error_handler (_("%pB: unable to load COMDAT section name"), 955 1.10 christos abfd); 956 1.10 christos continue; 957 1.1 skrll } 958 1.10 christos 959 1.1 skrll union internal_auxent aux; 960 1.10 christos 961 1.10 christos struct comdat_hash_entry needle; 962 1.1 skrll needle.target_index = isym.n_scnum; 963 1.10 christos 964 1.10 christos void **slot 965 1.10 christos = htab_find_slot (pe_data (abfd)->comdat_hash, &needle, INSERT); 966 1.10 christos if (slot == NULL) 967 1.1 skrll return false; 968 1.10 christos 969 1.10 christos if (*slot == NULL) 970 1.10 christos { 971 1.10 christos if (isym.n_numaux != 1) 972 1.10 christos aux.x_scn.x_comdat = 0; 973 1.10 christos else 974 1.10 christos { 975 1.10 christos /* PR 17512: file: e2cfe54f. */ 976 1.10 christos if (esym + isym.n_numaux * bfd_coff_symesz (abfd) >= esymend) 977 1.10 christos { 978 1.10 christos /* xgettext:c-format */ 979 1.10 christos _bfd_error_handler (_("%pB: warning: no symbol for" 980 1.10 christos " section '%s' found"), 981 1.10 christos abfd, symname); 982 1.10 christos continue; 983 1.10 christos } 984 1.10 christos bfd_coff_swap_aux_in (abfd, (esym + bfd_coff_symesz (abfd)), 985 1.10 christos isym.n_type, isym.n_sclass, 0, 986 1.10 christos isym.n_numaux, &aux); 987 1.1 skrll } 988 1.10 christos 989 1.10 christos /* FIXME: Microsoft uses NODUPLICATES and ASSOCIATIVE, but 990 1.10 christos gnu uses ANY and SAME_SIZE. Unfortunately, gnu doesn't 991 1.10 christos do the comdat symbols right. So, until we can fix it to 992 1.10 christos do the right thing, we are temporarily disabling comdats 993 1.10 christos for the MS types (they're used in DLLs and C++, but we 994 1.10 christos don't support *their* C++ libraries anyway - DJ. */ 995 1.10 christos 996 1.10 christos /* Cygwin does not follow the MS style, and uses ANY and 997 1.10 christos SAME_SIZE where NODUPLICATES and ASSOCIATIVE should be 998 1.10 christos used. For Interix, we just do the right thing up 999 1.1 skrll front. */ 1000 1.10 christos 1001 1.10 christos switch (aux.x_scn.x_comdat) 1002 1.10 christos { 1003 1.1 skrll case IMAGE_COMDAT_SELECT_NODUPLICATES: 1004 1.10 christos #ifdef STRICT_PE_FORMAT 1005 1.1 skrll sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY; 1006 1.10 christos #else 1007 1.1 skrll sec_flags &= ~SEC_LINK_ONCE; 1008 1.10 christos #endif 1009 1.1 skrll break; 1010 1.10 christos 1011 1.10 christos case IMAGE_COMDAT_SELECT_ANY: 1012 1.10 christos sec_flags |= SEC_LINK_DUPLICATES_DISCARD; 1013 1.1 skrll break; 1014 1.10 christos 1015 1.10 christos case IMAGE_COMDAT_SELECT_SAME_SIZE: 1016 1.10 christos sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE; 1017 1.1 skrll break; 1018 1.10 christos 1019 1.10 christos case IMAGE_COMDAT_SELECT_EXACT_MATCH: 1020 1.10 christos /* Not yet fully implemented ??? */ 1021 1.10 christos sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS; 1022 1.1 skrll break; 1023 1.10 christos 1024 1.1 skrll /* debug$S gets this case; other implications ??? */ 1025 1.10 christos 1026 1.10 christos /* There may be no symbol. We'll search the whole 1027 1.10 christos table. Is this the right place to play this game? 1028 1.10 christos Or should we do it when reading it in? */ 1029 1.1 skrll case IMAGE_COMDAT_SELECT_ASSOCIATIVE: 1030 1.10 christos #ifdef STRICT_PE_FORMAT 1031 1.10 christos /* FIXME: This is not currently implemented. */ 1032 1.1 skrll sec_flags |= SEC_LINK_DUPLICATES_DISCARD; 1033 1.10 christos #else 1034 1.1 skrll sec_flags &= ~SEC_LINK_ONCE; 1035 1.10 christos #endif 1036 1.1 skrll break; 1037 1.10 christos 1038 1.10 christos default: /* 0 means "no symbol" */ 1039 1.10 christos /* debug$F gets this case; other implications ??? */ 1040 1.1 skrll sec_flags |= SEC_LINK_DUPLICATES_DISCARD; 1041 1.10 christos break; 1042 1.1 skrll } 1043 1.10 christos 1044 1.10 christos *slot = bfd_zmalloc (sizeof (struct comdat_hash_entry)); 1045 1.10 christos if (*slot == NULL) 1046 1.10 christos return false; 1047 1.10 christos struct comdat_hash_entry *newentry = *slot; 1048 1.10 christos newentry->sec_flags = sec_flags; 1049 1.10 christos newentry->symname = bfd_strdup (symname); 1050 1.10 christos newentry->target_index = isym.n_scnum; 1051 1.10 christos newentry->isym = isym; 1052 1.10 christos newentry->comdat_symbol = -1; 1053 1.10 christos } 1054 1.10 christos else 1055 1.10 christos { 1056 1.10 christos struct comdat_hash_entry *entry = *slot; 1057 1.10 christos 1058 1.10 christos if (entry->comdat_symbol != -1) 1059 1.10 christos continue; 1060 1.10 christos 1061 1.10 christos char *target_name = strchr (entry->symname, '$'); 1062 1.10 christos if (target_name != NULL) 1063 1.1 skrll { 1064 1.1 skrll /* Gas mode: the first matching on partial name. */ 1065 1.10 christos 1066 1.1 skrll target_name += 1; 1067 1.1 skrll #ifndef TARGET_UNDERSCORE 1068 1.1 skrll #define TARGET_UNDERSCORE 0 1069 1.1 skrll #endif 1070 1.1 skrll /* Is this the name we're looking for ? */ 1071 1.1 skrll if (strcmp (target_name, 1072 1.1 skrll symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0) 1073 1.1 skrll { 1074 1.1 skrll /* Not the name we're looking for */ 1075 1.1 skrll continue; 1076 1.10 christos } 1077 1.10 christos } 1078 1.10 christos /* MSVC mode: the lexically second symbol (or drop through 1079 1.10 christos from the above). */ 1080 1.10 christos /* This must the second symbol with the section #. It is 1081 1.10 christos the actual symbol name. Intel puts the two adjacent, but 1082 1.10 christos Alpha (at least) spreads them out. */ 1083 1.10 christos 1084 1.10 christos entry->comdat_symbol = (esym - esymstart) / bfd_coff_symesz (abfd); 1085 1.10 christos entry->comdat_name = bfd_strdup (symname); 1086 1.10 christos } 1087 1.10 christos } 1088 1.10 christos 1089 1.10 christos return true; 1090 1.10 christos } 1091 1.10 christos 1092 1.10 christos static bool 1093 1.10 christos insert_coff_comdat_info (bfd *abfd, asection *section, const char *symname, 1094 1.10 christos long symbol) 1095 1.10 christos { 1096 1.10 christos struct coff_comdat_info *comdat; 1097 1.10 christos size_t len = strlen (symname) + 1; 1098 1.10 christos 1099 1.10 christos comdat = bfd_alloc (abfd, sizeof (*comdat) + len); 1100 1.10 christos if (comdat == NULL) 1101 1.10 christos return false; 1102 1.10 christos 1103 1.10 christos coff_section_data (abfd, section)->comdat = comdat; 1104 1.10 christos comdat->symbol = symbol; 1105 1.10 christos char *newname = (char *) (comdat + 1); 1106 1.10 christos comdat->name = newname; 1107 1.10 christos memcpy (newname, symname, len); 1108 1.10 christos return true; 1109 1.10 christos } 1110 1.10 christos 1111 1.10 christos static bool 1112 1.10 christos handle_COMDAT (bfd *abfd, flagword *sec_flags, const char *name, 1113 1.10 christos asection *section) 1114 1.10 christos { 1115 1.10 christos if (pe_data (abfd)->comdat_hash == NULL) 1116 1.10 christos { 1117 1.10 christos pe_data (abfd)->comdat_hash = htab_create (10, comdat_hashf, comdat_eqf, 1118 1.10 christos comdat_delf); 1119 1.10 christos if (pe_data (abfd)->comdat_hash == NULL) 1120 1.10 christos return false; 1121 1.10 christos } 1122 1.10 christos 1123 1.10 christos if (htab_elements (pe_data (abfd)->comdat_hash) == 0) 1124 1.10 christos if (! fill_comdat_hash (abfd)) 1125 1.10 christos return false; 1126 1.10 christos 1127 1.10 christos struct comdat_hash_entry *found 1128 1.10 christos = find_flags (pe_data (abfd)->comdat_hash, section->target_index); 1129 1.10 christos if (found != NULL) 1130 1.10 christos { 1131 1.10 christos struct internal_syment isym = found->isym; 1132 1.10 christos 1133 1.10 christos /* If it isn't the stuff we're expecting, die; The MS 1134 1.10 christos documentation is vague, but it appears that the second entry 1135 1.10 christos serves BOTH as the comdat symbol and the defining symbol 1136 1.10 christos record (either C_STAT or C_EXT, possibly with an aux entry 1137 1.10 christos with debug information if it's a function.) It appears the 1138 1.10 christos only way to find the second one is to count. (On Intel, they 1139 1.10 christos appear to be adjacent, but on Alpha, they have been found 1140 1.1 skrll separated.) 1141 1.10 christos 1142 1.10 christos Here, we think we've found the first one, but there's some 1143 1.1 skrll checking we can do to be sure. */ 1144 1.10 christos 1145 1.10 christos if (! ((isym.n_sclass == C_STAT || isym.n_sclass == C_EXT) 1146 1.10 christos && BTYPE (isym.n_type) == T_NULL && isym.n_value == 0)) 1147 1.10 christos { 1148 1.10 christos /* Malformed input files can trigger this test. 1149 1.10 christos cf PR 21781. */ 1150 1.10 christos _bfd_error_handler 1151 1.10 christos (_("%pB: error: unexpected symbol '%s' in COMDAT section"), 1152 1.10 christos abfd, found->symname); 1153 1.1 skrll return false; 1154 1.1 skrll } 1155 1.10 christos 1156 1.10 christos /* FIXME LATER: MSVC generates section names like .text for 1157 1.10 christos comdats. Gas generates names like .text$foo__Fv (in the case 1158 1.10 christos of a function). See comment above for more. */ 1159 1.10 christos 1160 1.10 christos if (isym.n_sclass == C_STAT && strcmp (name, found->symname) != 0) 1161 1.10 christos /* xgettext:c-format */ 1162 1.10 christos _bfd_error_handler (_("%pB: warning: COMDAT symbol '%s'" 1163 1.10 christos " does not match section name '%s'"), 1164 1.10 christos abfd, found->symname, name); 1165 1.10 christos 1166 1.10 christos if (found->comdat_symbol != -1) 1167 1.10 christos { 1168 1.10 christos if (! insert_coff_comdat_info (abfd, section, found->comdat_name, 1169 1.10 christos found->comdat_symbol)) 1170 1.10 christos return false; 1171 1.10 christos } 1172 1.10 christos *sec_flags = *sec_flags | found->sec_flags; 1173 1.1 skrll return true; 1174 1.10 christos } 1175 1.10 christos *sec_flags = *sec_flags | SEC_LINK_ONCE; 1176 1.1 skrll return true; 1177 1.1 skrll } 1178 1.1 skrll 1179 1.1 skrll 1180 1.1 skrll /* The PE version; see above for the general comments. 1181 1.1 skrll 1182 1.1 skrll Since to set the SEC_LINK_ONCE and associated flags, we have to 1183 1.1 skrll look at the symbol table anyway, we return the symbol table index 1184 1.1 skrll of the symbol being used as the COMDAT symbol. This is admittedly 1185 1.1 skrll ugly, but there's really nowhere else that we have access to the 1186 1.1 skrll required information. FIXME: Is the COMDAT symbol index used for 1187 1.1 skrll any purpose other than objdump? */ 1188 1.9 christos 1189 1.1 skrll static bool 1190 1.1 skrll styp_to_sec_flags (bfd *abfd, 1191 1.1 skrll void * hdr, 1192 1.1 skrll const char *name, 1193 1.1 skrll asection *section, 1194 1.1 skrll flagword *flags_ptr) 1195 1.1 skrll { 1196 1.3 christos struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; 1197 1.1 skrll unsigned long styp_flags = internal_s->s_flags; 1198 1.9 christos flagword sec_flags; 1199 1.9 christos bool result = true; 1200 1.1 skrll bool is_dbg = false; 1201 1.9 christos 1202 1.9 christos if (startswith (name, DOT_DEBUG) 1203 1.2 matt || startswith (name, DOT_ZDEBUG) 1204 1.9 christos #ifdef COFF_LONG_SECTION_NAMES 1205 1.9 christos || startswith (name, GNU_LINKONCE_WI) 1206 1.8 christos || startswith (name, GNU_LINKONCE_WT) 1207 1.8 christos /* FIXME: These definitions ought to be in a header file. */ 1208 1.8 christos #define GNU_DEBUGLINK ".gnu_debuglink" 1209 1.9 christos #define GNU_DEBUGALTLINK ".gnu_debugaltlink" 1210 1.9 christos || startswith (name, GNU_DEBUGLINK) 1211 1.2 matt || startswith (name, GNU_DEBUGALTLINK) 1212 1.9 christos #endif 1213 1.9 christos || startswith (name, ".stab")) 1214 1.1 skrll is_dbg = true; 1215 1.1 skrll /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */ 1216 1.1 skrll sec_flags = SEC_READONLY; 1217 1.2 matt 1218 1.2 matt /* If section disallows read, then set the NOREAD flag. */ 1219 1.2 matt if ((styp_flags & IMAGE_SCN_MEM_READ) == 0) 1220 1.2 matt sec_flags |= SEC_COFF_NOREAD; 1221 1.1 skrll 1222 1.1 skrll /* Process each flag bit in styp_flags in turn. */ 1223 1.1 skrll while (styp_flags) 1224 1.3 christos { 1225 1.1 skrll unsigned long flag = styp_flags & - styp_flags; 1226 1.1 skrll char * unhandled = NULL; 1227 1.1 skrll 1228 1.1 skrll styp_flags &= ~ flag; 1229 1.1 skrll 1230 1.1 skrll /* We infer from the distinct read/write/execute bits the settings 1231 1.1 skrll of some of the bfd flags; the actual values, should we need them, 1232 1.1 skrll are also in pei_section_data (abfd, section)->pe_flags. */ 1233 1.1 skrll 1234 1.1 skrll switch (flag) 1235 1.1 skrll { 1236 1.1 skrll case STYP_DSECT: 1237 1.1 skrll unhandled = "STYP_DSECT"; 1238 1.1 skrll break; 1239 1.1 skrll case STYP_GROUP: 1240 1.1 skrll unhandled = "STYP_GROUP"; 1241 1.1 skrll break; 1242 1.1 skrll case STYP_COPY: 1243 1.1 skrll unhandled = "STYP_COPY"; 1244 1.1 skrll break; 1245 1.1 skrll case STYP_OVER: 1246 1.1 skrll unhandled = "STYP_OVER"; 1247 1.1 skrll break; 1248 1.1 skrll #ifdef SEC_NEVER_LOAD 1249 1.1 skrll case STYP_NOLOAD: 1250 1.1 skrll sec_flags |= SEC_NEVER_LOAD; 1251 1.1 skrll break; 1252 1.1 skrll #endif 1253 1.2 matt case IMAGE_SCN_MEM_READ: 1254 1.1 skrll sec_flags &= ~SEC_COFF_NOREAD; 1255 1.1 skrll break; 1256 1.1 skrll case IMAGE_SCN_TYPE_NO_PAD: 1257 1.1 skrll /* Skip. */ 1258 1.1 skrll break; 1259 1.1 skrll case IMAGE_SCN_LNK_OTHER: 1260 1.1 skrll unhandled = "IMAGE_SCN_LNK_OTHER"; 1261 1.1 skrll break; 1262 1.1 skrll case IMAGE_SCN_MEM_NOT_CACHED: 1263 1.1 skrll unhandled = "IMAGE_SCN_MEM_NOT_CACHED"; 1264 1.1 skrll break; 1265 1.1 skrll case IMAGE_SCN_MEM_NOT_PAGED: 1266 1.1 skrll /* Generate a warning message rather using the 'unhandled' 1267 1.1 skrll variable as this will allow some .sys files generate by 1268 1.6 christos other toolchains to be processed. See bugzilla issue 196. */ 1269 1.7 christos /* xgettext:c-format */ 1270 1.7 christos _bfd_error_handler (_("%pB: warning: ignoring section flag" 1271 1.7 christos " %s in section %s"), 1272 1.1 skrll abfd, "IMAGE_SCN_MEM_NOT_PAGED", name); 1273 1.1 skrll break; 1274 1.1 skrll case IMAGE_SCN_MEM_EXECUTE: 1275 1.1 skrll sec_flags |= SEC_CODE; 1276 1.1 skrll break; 1277 1.1 skrll case IMAGE_SCN_MEM_WRITE: 1278 1.1 skrll sec_flags &= ~ SEC_READONLY; 1279 1.1 skrll break; 1280 1.2 matt case IMAGE_SCN_MEM_DISCARDABLE: 1281 1.2 matt /* The MS PE spec says that debug sections are DISCARDABLE, 1282 1.2 matt but the presence of a DISCARDABLE flag does not necessarily 1283 1.2 matt mean that a given section contains debug information. Thus 1284 1.2 matt we only set the SEC_DEBUGGING flag on sections that we 1285 1.2 matt recognise as containing debug information. */ 1286 1.2 matt if (is_dbg 1287 1.2 matt #ifdef _COMMENT 1288 1.2 matt || strcmp (name, _COMMENT) == 0 1289 1.2 matt #endif 1290 1.2 matt ) 1291 1.2 matt { 1292 1.2 matt sec_flags |= SEC_DEBUGGING | SEC_READONLY; 1293 1.1 skrll } 1294 1.1 skrll break; 1295 1.1 skrll case IMAGE_SCN_MEM_SHARED: 1296 1.1 skrll sec_flags |= SEC_COFF_SHARED; 1297 1.1 skrll break; 1298 1.2 matt case IMAGE_SCN_LNK_REMOVE: 1299 1.2 matt if (!is_dbg) 1300 1.1 skrll sec_flags |= SEC_EXCLUDE; 1301 1.1 skrll break; 1302 1.1 skrll case IMAGE_SCN_CNT_CODE: 1303 1.1 skrll sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD; 1304 1.1 skrll break; 1305 1.2 matt case IMAGE_SCN_CNT_INITIALIZED_DATA: 1306 1.2 matt if (is_dbg) 1307 1.2 matt sec_flags |= SEC_DEBUGGING; 1308 1.2 matt else 1309 1.1 skrll sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD; 1310 1.1 skrll break; 1311 1.1 skrll case IMAGE_SCN_CNT_UNINITIALIZED_DATA: 1312 1.1 skrll sec_flags |= SEC_ALLOC; 1313 1.1 skrll break; 1314 1.1 skrll case IMAGE_SCN_LNK_INFO: 1315 1.1 skrll /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is 1316 1.1 skrll defined. coff_compute_section_file_positions uses 1317 1.1 skrll COFF_PAGE_SIZE to ensure that the low order bits of the 1318 1.1 skrll section VMA and the file offset match. If we don't know 1319 1.1 skrll COFF_PAGE_SIZE, we can't ensure the correct correspondence, 1320 1.1 skrll and demand page loading of the file will fail. */ 1321 1.1 skrll #ifdef COFF_PAGE_SIZE 1322 1.1 skrll sec_flags |= SEC_DEBUGGING; 1323 1.1 skrll #endif 1324 1.1 skrll break; 1325 1.1 skrll case IMAGE_SCN_LNK_COMDAT: 1326 1.10 christos /* COMDAT gets very special treatment. */ 1327 1.10 christos if (!handle_COMDAT (abfd, &sec_flags, name, section)) 1328 1.1 skrll result = false; 1329 1.1 skrll break; 1330 1.1 skrll default: 1331 1.1 skrll /* Silently ignore for now. */ 1332 1.1 skrll break; 1333 1.1 skrll } 1334 1.1 skrll 1335 1.1 skrll /* If the section flag was not handled, report it here. */ 1336 1.1 skrll if (unhandled != NULL) 1337 1.6 christos { 1338 1.6 christos _bfd_error_handler 1339 1.7 christos /* xgettext:c-format */ 1340 1.1 skrll (_("%pB (%s): section flag %s (%#lx) ignored"), 1341 1.9 christos abfd, name, unhandled, flag); 1342 1.1 skrll result = false; 1343 1.1 skrll } 1344 1.1 skrll } 1345 1.9 christos 1346 1.9 christos if ((bfd_applicable_section_flags (abfd) & SEC_SMALL_DATA) != 0 1347 1.9 christos && (startswith (name, ".sbss") 1348 1.9 christos || startswith (name, ".sdata"))) 1349 1.9 christos sec_flags |= SEC_SMALL_DATA; 1350 1.12 christos 1351 1.12 christos /* As there is no internal representation of the "discardable" flag, 1352 1.12 christos reflect it by keeping SEC_ALLOC clear. */ 1353 1.12 christos if (internal_s->s_flags & IMAGE_SCN_MEM_DISCARDABLE) 1354 1.12 christos sec_flags &= ~SEC_ALLOC; 1355 1.1 skrll 1356 1.1 skrll #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE) 1357 1.1 skrll /* As a GNU extension, if the name begins with .gnu.linkonce, we 1358 1.1 skrll only link a single copy of the section. This is used to support 1359 1.1 skrll g++. g++ will emit each template expansion in its own section. 1360 1.1 skrll The symbols will be defined as weak, so that multiple definitions 1361 1.1 skrll are permitted. The GNU linker extension is to actually discard 1362 1.9 christos all but one of the sections. */ 1363 1.1 skrll if (startswith (name, ".gnu.linkonce")) 1364 1.1 skrll sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; 1365 1.1 skrll #endif 1366 1.1 skrll 1367 1.1 skrll if (flags_ptr) 1368 1.1 skrll * flags_ptr = sec_flags; 1369 1.1 skrll 1370 1.1 skrll return result; 1371 1.1 skrll } 1372 1.1 skrll 1373 1.1 skrll #endif /* COFF_WITH_PE */ 1374 1.1 skrll 1375 1.1 skrll #define get_index(symbol) ((symbol)->udata.i) 1376 1.1 skrll 1377 1.1 skrll /* 1378 1.1 skrll INTERNAL_DEFINITION 1379 1.1 skrll bfd_coff_backend_data 1380 1.10 christos 1381 1.1 skrll INTERNAL 1382 1.1 skrll .{* COFF symbol classifications. *} 1383 1.1 skrll . 1384 1.1 skrll .enum coff_symbol_classification 1385 1.1 skrll .{ 1386 1.1 skrll . {* Global symbol. *} 1387 1.1 skrll . COFF_SYMBOL_GLOBAL, 1388 1.1 skrll . {* Common symbol. *} 1389 1.1 skrll . COFF_SYMBOL_COMMON, 1390 1.1 skrll . {* Undefined symbol. *} 1391 1.1 skrll . COFF_SYMBOL_UNDEFINED, 1392 1.1 skrll . {* Local symbol. *} 1393 1.1 skrll . COFF_SYMBOL_LOCAL, 1394 1.1 skrll . {* PE section symbol. *} 1395 1.1 skrll . COFF_SYMBOL_PE_SECTION 1396 1.1 skrll .}; 1397 1.3 christos . 1398 1.3 christos .typedef asection * (*coff_gc_mark_hook_fn) 1399 1.3 christos . (asection *, struct bfd_link_info *, struct internal_reloc *, 1400 1.3 christos . struct coff_link_hash_entry *, struct internal_syment *); 1401 1.10 christos . 1402 1.1 skrll 1403 1.10 christos Special entry points for gdb to swap in coff symbol table parts: 1404 1.10 christos 1405 1.1 skrll CODE_FRAGMENT 1406 1.1 skrll .typedef struct 1407 1.1 skrll .{ 1408 1.1 skrll . void (*_bfd_coff_swap_aux_in) 1409 1.1 skrll . (bfd *, void *, int, int, int, int, void *); 1410 1.1 skrll . 1411 1.1 skrll . void (*_bfd_coff_swap_sym_in) 1412 1.1 skrll . (bfd *, void *, void *); 1413 1.1 skrll . 1414 1.1 skrll . void (*_bfd_coff_swap_lineno_in) 1415 1.1 skrll . (bfd *, void *, void *); 1416 1.1 skrll . 1417 1.1 skrll . unsigned int (*_bfd_coff_swap_aux_out) 1418 1.1 skrll . (bfd *, void *, int, int, int, int, void *); 1419 1.1 skrll . 1420 1.1 skrll . unsigned int (*_bfd_coff_swap_sym_out) 1421 1.1 skrll . (bfd *, void *, void *); 1422 1.1 skrll . 1423 1.1 skrll . unsigned int (*_bfd_coff_swap_lineno_out) 1424 1.1 skrll . (bfd *, void *, void *); 1425 1.1 skrll . 1426 1.1 skrll . unsigned int (*_bfd_coff_swap_reloc_out) 1427 1.1 skrll . (bfd *, void *, void *); 1428 1.1 skrll . 1429 1.1 skrll . unsigned int (*_bfd_coff_swap_filehdr_out) 1430 1.1 skrll . (bfd *, void *, void *); 1431 1.1 skrll . 1432 1.1 skrll . unsigned int (*_bfd_coff_swap_aouthdr_out) 1433 1.1 skrll . (bfd *, void *, void *); 1434 1.1 skrll . 1435 1.12 christos . unsigned int (*_bfd_coff_swap_scnhdr_out) 1436 1.1 skrll . (bfd *, void *, void *, const asection *); 1437 1.1 skrll . 1438 1.1 skrll . unsigned int _bfd_filhsz; 1439 1.1 skrll . unsigned int _bfd_aoutsz; 1440 1.1 skrll . unsigned int _bfd_scnhsz; 1441 1.1 skrll . unsigned int _bfd_symesz; 1442 1.1 skrll . unsigned int _bfd_auxesz; 1443 1.1 skrll . unsigned int _bfd_relsz; 1444 1.1 skrll . unsigned int _bfd_linesz; 1445 1.9 christos . unsigned int _bfd_filnmlen; 1446 1.2 matt . bool _bfd_coff_long_filenames; 1447 1.9 christos . 1448 1.9 christos . bool _bfd_coff_long_section_names; 1449 1.2 matt . bool (*_bfd_coff_set_long_section_names) 1450 1.3 christos . (bfd *, int); 1451 1.1 skrll . 1452 1.9 christos . unsigned int _bfd_coff_default_section_alignment_power; 1453 1.1 skrll . bool _bfd_coff_force_symnames_in_strings; 1454 1.3 christos . unsigned int _bfd_coff_debug_string_prefix_length; 1455 1.1 skrll . unsigned int _bfd_coff_max_nscns; 1456 1.1 skrll . 1457 1.1 skrll . void (*_bfd_coff_swap_filehdr_in) 1458 1.1 skrll . (bfd *, void *, void *); 1459 1.1 skrll . 1460 1.1 skrll . void (*_bfd_coff_swap_aouthdr_in) 1461 1.1 skrll . (bfd *, void *, void *); 1462 1.1 skrll . 1463 1.1 skrll . void (*_bfd_coff_swap_scnhdr_in) 1464 1.1 skrll . (bfd *, void *, void *); 1465 1.1 skrll . 1466 1.1 skrll . void (*_bfd_coff_swap_reloc_in) 1467 1.1 skrll . (bfd *abfd, void *, void *); 1468 1.9 christos . 1469 1.1 skrll . bool (*_bfd_coff_bad_format_hook) 1470 1.1 skrll . (bfd *, void *); 1471 1.9 christos . 1472 1.1 skrll . bool (*_bfd_coff_set_arch_mach_hook) 1473 1.1 skrll . (bfd *, void *); 1474 1.1 skrll . 1475 1.1 skrll . void * (*_bfd_coff_mkobject_hook) 1476 1.1 skrll . (bfd *, void *, void *); 1477 1.9 christos . 1478 1.1 skrll . bool (*_bfd_styp_to_sec_flags_hook) 1479 1.1 skrll . (bfd *, void *, const char *, asection *, flagword *); 1480 1.1 skrll . 1481 1.1 skrll . void (*_bfd_set_alignment_hook) 1482 1.1 skrll . (bfd *, asection *, void *); 1483 1.9 christos . 1484 1.1 skrll . bool (*_bfd_coff_slurp_symbol_table) 1485 1.1 skrll . (bfd *); 1486 1.9 christos . 1487 1.1 skrll . bool (*_bfd_coff_symname_in_debug) 1488 1.1 skrll . (bfd *, struct internal_syment *); 1489 1.9 christos . 1490 1.1 skrll . bool (*_bfd_coff_pointerize_aux_hook) 1491 1.6 christos . (bfd *, combined_entry_type *, combined_entry_type *, 1492 1.1 skrll . unsigned int, combined_entry_type *); 1493 1.9 christos . 1494 1.1 skrll . bool (*_bfd_coff_print_aux) 1495 1.6 christos . (bfd *, FILE *, combined_entry_type *, combined_entry_type *, 1496 1.1 skrll . combined_entry_type *, unsigned int); 1497 1.10 christos . 1498 1.1 skrll . bool (*_bfd_coff_reloc16_extra_cases) 1499 1.10 christos . (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, 1500 1.1 skrll . bfd_byte *, size_t *, size_t *); 1501 1.1 skrll . 1502 1.1 skrll . int (*_bfd_coff_reloc16_estimate) 1503 1.6 christos . (bfd *, asection *, arelent *, unsigned int, 1504 1.1 skrll . struct bfd_link_info *); 1505 1.1 skrll . 1506 1.1 skrll . enum coff_symbol_classification (*_bfd_coff_classify_symbol) 1507 1.1 skrll . (bfd *, struct internal_syment *); 1508 1.9 christos . 1509 1.1 skrll . bool (*_bfd_coff_compute_section_file_positions) 1510 1.1 skrll . (bfd *); 1511 1.9 christos . 1512 1.1 skrll . bool (*_bfd_coff_start_final_link) 1513 1.1 skrll . (bfd *, struct bfd_link_info *); 1514 1.9 christos . 1515 1.1 skrll . bool (*_bfd_coff_relocate_section) 1516 1.6 christos . (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 1517 1.1 skrll . struct internal_reloc *, struct internal_syment *, asection **); 1518 1.1 skrll . 1519 1.1 skrll . reloc_howto_type *(*_bfd_coff_rtype_to_howto) 1520 1.6 christos . (bfd *, asection *, struct internal_reloc *, 1521 1.1 skrll . struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *); 1522 1.9 christos . 1523 1.1 skrll . bool (*_bfd_coff_adjust_symndx) 1524 1.9 christos . (bfd *, struct bfd_link_info *, bfd *, asection *, 1525 1.1 skrll . struct internal_reloc *, bool *); 1526 1.9 christos . 1527 1.1 skrll . bool (*_bfd_coff_link_output_has_begun) 1528 1.1 skrll . (bfd *, struct coff_final_link_info *); 1529 1.9 christos . 1530 1.1 skrll . bool (*_bfd_coff_final_link_postscript) 1531 1.1 skrll . (bfd *, struct coff_final_link_info *); 1532 1.9 christos . 1533 1.1 skrll . bool (*_bfd_coff_print_pdata) 1534 1.1 skrll . (bfd *, void *); 1535 1.1 skrll . 1536 1.1 skrll .} bfd_coff_backend_data; 1537 1.10 christos . 1538 1.10 christos 1539 1.1 skrll INTERNAL 1540 1.10 christos .#define coff_backend_info(abfd) \ 1541 1.1 skrll . ((const bfd_coff_backend_data *) (abfd)->xvec->backend_data) 1542 1.1 skrll . 1543 1.1 skrll .#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ 1544 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) 1545 1.1 skrll . 1546 1.1 skrll .#define bfd_coff_swap_sym_in(a,e,i) \ 1547 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) 1548 1.1 skrll . 1549 1.1 skrll .#define bfd_coff_swap_lineno_in(a,e,i) \ 1550 1.1 skrll . ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) 1551 1.1 skrll . 1552 1.1 skrll .#define bfd_coff_swap_reloc_out(abfd, i, o) \ 1553 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) 1554 1.1 skrll . 1555 1.1 skrll .#define bfd_coff_swap_lineno_out(abfd, i, o) \ 1556 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) 1557 1.1 skrll . 1558 1.1 skrll .#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ 1559 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) 1560 1.1 skrll . 1561 1.1 skrll .#define bfd_coff_swap_sym_out(abfd, i,o) \ 1562 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) 1563 1.12 christos . 1564 1.12 christos .#define bfd_coff_swap_scnhdr_out(abfd, i, o, sec) \ 1565 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o, sec)) 1566 1.1 skrll . 1567 1.1 skrll .#define bfd_coff_swap_filehdr_out(abfd, i,o) \ 1568 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) 1569 1.1 skrll . 1570 1.1 skrll .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ 1571 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) 1572 1.1 skrll . 1573 1.1 skrll .#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) 1574 1.1 skrll .#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) 1575 1.1 skrll .#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) 1576 1.1 skrll .#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) 1577 1.1 skrll .#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) 1578 1.1 skrll .#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) 1579 1.1 skrll .#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) 1580 1.1 skrll .#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) 1581 1.1 skrll .#define bfd_coff_long_filenames(abfd) \ 1582 1.1 skrll . (coff_backend_info (abfd)->_bfd_coff_long_filenames) 1583 1.10 christos .#define bfd_coff_long_section_names(abfd) \ 1584 1.2 matt . (coff_data (abfd)->long_section_names) 1585 1.2 matt .#define bfd_coff_set_long_section_names(abfd, enable) \ 1586 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) 1587 1.1 skrll .#define bfd_coff_default_section_alignment_power(abfd) \ 1588 1.3 christos . (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) 1589 1.3 christos .#define bfd_coff_max_nscns(abfd) \ 1590 1.3 christos . (coff_backend_info (abfd)->_bfd_coff_max_nscns) 1591 1.1 skrll . 1592 1.1 skrll .#define bfd_coff_swap_filehdr_in(abfd, i,o) \ 1593 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) 1594 1.1 skrll . 1595 1.1 skrll .#define bfd_coff_swap_aouthdr_in(abfd, i,o) \ 1596 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) 1597 1.1 skrll . 1598 1.1 skrll .#define bfd_coff_swap_scnhdr_in(abfd, i,o) \ 1599 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) 1600 1.1 skrll . 1601 1.1 skrll .#define bfd_coff_swap_reloc_in(abfd, i, o) \ 1602 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) 1603 1.1 skrll . 1604 1.1 skrll .#define bfd_coff_bad_format_hook(abfd, filehdr) \ 1605 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) 1606 1.1 skrll . 1607 1.1 skrll .#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ 1608 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) 1609 1.1 skrll .#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ 1610 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\ 1611 1.1 skrll . (abfd, filehdr, aouthdr)) 1612 1.1 skrll . 1613 1.1 skrll .#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\ 1614 1.1 skrll . ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ 1615 1.1 skrll . (abfd, scnhdr, name, section, flags_ptr)) 1616 1.1 skrll . 1617 1.1 skrll .#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ 1618 1.1 skrll . ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) 1619 1.1 skrll . 1620 1.1 skrll .#define bfd_coff_slurp_symbol_table(abfd)\ 1621 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) 1622 1.1 skrll . 1623 1.1 skrll .#define bfd_coff_symname_in_debug(abfd, sym)\ 1624 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) 1625 1.1 skrll . 1626 1.1 skrll .#define bfd_coff_force_symnames_in_strings(abfd)\ 1627 1.1 skrll . (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) 1628 1.1 skrll . 1629 1.1 skrll .#define bfd_coff_debug_string_prefix_length(abfd)\ 1630 1.1 skrll . (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) 1631 1.1 skrll . 1632 1.1 skrll .#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ 1633 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ 1634 1.1 skrll . (abfd, file, base, symbol, aux, indaux)) 1635 1.1 skrll . 1636 1.6 christos .#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\ 1637 1.1 skrll . reloc, data, src_ptr, dst_ptr)\ 1638 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ 1639 1.1 skrll . (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) 1640 1.1 skrll . 1641 1.1 skrll .#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ 1642 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ 1643 1.1 skrll . (abfd, section, reloc, shrink, link_info)) 1644 1.1 skrll . 1645 1.1 skrll .#define bfd_coff_classify_symbol(abfd, sym)\ 1646 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ 1647 1.1 skrll . (abfd, sym)) 1648 1.1 skrll . 1649 1.1 skrll .#define bfd_coff_compute_section_file_positions(abfd)\ 1650 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ 1651 1.1 skrll . (abfd)) 1652 1.1 skrll . 1653 1.1 skrll .#define bfd_coff_start_final_link(obfd, info)\ 1654 1.1 skrll . ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ 1655 1.1 skrll . (obfd, info)) 1656 1.1 skrll .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ 1657 1.1 skrll . ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ 1658 1.1 skrll . (obfd, info, ibfd, o, con, rel, isyms, secs)) 1659 1.1 skrll .#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ 1660 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ 1661 1.1 skrll . (abfd, sec, rel, h, sym, addendp)) 1662 1.1 skrll .#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ 1663 1.1 skrll . ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ 1664 1.1 skrll . (obfd, info, ibfd, sec, rel, adjustedp)) 1665 1.1 skrll . 1666 1.1 skrll .#define bfd_coff_link_output_has_begun(a,p) \ 1667 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p)) 1668 1.1 skrll .#define bfd_coff_final_link_postscript(a,p) \ 1669 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p)) 1670 1.1 skrll . 1671 1.1 skrll .#define bfd_coff_have_print_pdata(a) \ 1672 1.1 skrll . (coff_backend_info (a)->_bfd_coff_print_pdata) 1673 1.1 skrll .#define bfd_coff_print_pdata(a,p) \ 1674 1.1 skrll . ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p)) 1675 1.2 matt . 1676 1.2 matt .{* Macro: Returns true if the bfd is a PE executable as opposed to a 1677 1.2 matt . PE object file. *} 1678 1.9 christos .#define bfd_pei_p(abfd) \ 1679 1.1 skrll . (startswith ((abfd)->xvec->name, "pei-")) 1680 1.1 skrll */ 1681 1.1 skrll 1682 1.1 skrll /* See whether the magic number matches. */ 1683 1.9 christos 1684 1.1 skrll static bool 1685 1.1 skrll coff_bad_format_hook (bfd * abfd ATTRIBUTE_UNUSED, void * filehdr) 1686 1.1 skrll { 1687 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 1688 1.1 skrll 1689 1.9 christos if (BADMAG (*internal_f)) 1690 1.1 skrll return false; 1691 1.9 christos 1692 1.1 skrll return true; 1693 1.1 skrll } 1694 1.1 skrll 1695 1.9 christos #ifdef TICOFF 1696 1.1 skrll static bool 1697 1.1 skrll ticoff0_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED, void * filehdr) 1698 1.1 skrll { 1699 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 1700 1.1 skrll 1701 1.9 christos if (COFF0_BADMAG (*internal_f)) 1702 1.1 skrll return false; 1703 1.9 christos 1704 1.1 skrll return true; 1705 1.1 skrll } 1706 1.1 skrll #endif 1707 1.1 skrll 1708 1.9 christos #ifdef TICOFF 1709 1.1 skrll static bool 1710 1.1 skrll ticoff1_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED, void * filehdr) 1711 1.1 skrll { 1712 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 1713 1.1 skrll 1714 1.9 christos if (COFF1_BADMAG (*internal_f)) 1715 1.1 skrll return false; 1716 1.9 christos 1717 1.1 skrll return true; 1718 1.1 skrll } 1719 1.1 skrll #endif 1720 1.1 skrll 1721 1.1 skrll /* Check whether this section uses an alignment other than the 1722 1.1 skrll default. */ 1723 1.1 skrll 1724 1.1 skrll static void 1725 1.1 skrll coff_set_custom_section_alignment (bfd *abfd ATTRIBUTE_UNUSED, 1726 1.1 skrll asection *section, 1727 1.1 skrll const struct coff_section_alignment_entry *alignment_table, 1728 1.1 skrll const unsigned int table_size) 1729 1.1 skrll { 1730 1.1 skrll const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; 1731 1.1 skrll unsigned int i; 1732 1.1 skrll 1733 1.1 skrll for (i = 0; i < table_size; ++i) 1734 1.8 christos { 1735 1.1 skrll const char *secname = bfd_section_name (section); 1736 1.1 skrll 1737 1.1 skrll if (alignment_table[i].comparison_length == (unsigned int) -1 1738 1.1 skrll ? strcmp (alignment_table[i].name, secname) == 0 1739 1.1 skrll : strncmp (alignment_table[i].name, secname, 1740 1.1 skrll alignment_table[i].comparison_length) == 0) 1741 1.1 skrll break; 1742 1.1 skrll } 1743 1.1 skrll if (i >= table_size) 1744 1.1 skrll return; 1745 1.1 skrll 1746 1.1 skrll if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY 1747 1.1 skrll && default_alignment < alignment_table[i].default_alignment_min) 1748 1.1 skrll return; 1749 1.1 skrll 1750 1.1 skrll if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY 1751 1.1 skrll #if COFF_DEFAULT_SECTION_ALIGNMENT_POWER != 0 1752 1.1 skrll && default_alignment > alignment_table[i].default_alignment_max 1753 1.1 skrll #endif 1754 1.1 skrll ) 1755 1.1 skrll return; 1756 1.1 skrll 1757 1.1 skrll section->alignment_power = alignment_table[i].alignment_power; 1758 1.1 skrll } 1759 1.1 skrll 1760 1.1 skrll /* Custom section alignment records. */ 1761 1.1 skrll 1762 1.1 skrll static const struct coff_section_alignment_entry 1763 1.1 skrll coff_section_alignment_table[] = 1764 1.1 skrll { 1765 1.1 skrll #ifdef COFF_SECTION_ALIGNMENT_ENTRIES 1766 1.1 skrll COFF_SECTION_ALIGNMENT_ENTRIES, 1767 1.1 skrll #endif 1768 1.1 skrll /* There must not be any gaps between .stabstr sections. */ 1769 1.1 skrll { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"), 1770 1.1 skrll 1, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, 1771 1.1 skrll /* The .stab section must be aligned to 2**2 at most, to avoid gaps. */ 1772 1.1 skrll { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"), 1773 1.1 skrll 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, 1774 1.1 skrll /* Similarly for the .ctors and .dtors sections. */ 1775 1.1 skrll { COFF_SECTION_NAME_EXACT_MATCH (".ctors"), 1776 1.1 skrll 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, 1777 1.1 skrll { COFF_SECTION_NAME_EXACT_MATCH (".dtors"), 1778 1.1 skrll 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 } 1779 1.1 skrll }; 1780 1.1 skrll 1781 1.1 skrll static const unsigned int coff_section_alignment_table_size = 1782 1.1 skrll sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0]; 1783 1.1 skrll 1784 1.1 skrll /* Initialize a section structure with information peculiar to this 1785 1.1 skrll particular implementation of COFF. */ 1786 1.9 christos 1787 1.1 skrll static bool 1788 1.1 skrll coff_new_section_hook (bfd * abfd, asection * section) 1789 1.1 skrll { 1790 1.9 christos combined_entry_type *native; 1791 1.2 matt size_t amt; 1792 1.1 skrll unsigned char sclass = C_STAT; 1793 1.1 skrll 1794 1.1 skrll section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; 1795 1.1 skrll 1796 1.1 skrll #ifdef RS6000COFF_C 1797 1.8 christos if (bfd_xcoff_text_align_power (abfd) != 0 1798 1.1 skrll && strcmp (bfd_section_name (section), ".text") == 0) 1799 1.2 matt section->alignment_power = bfd_xcoff_text_align_power (abfd); 1800 1.8 christos else if (bfd_xcoff_data_align_power (abfd) != 0 1801 1.1 skrll && strcmp (bfd_section_name (section), ".data") == 0) 1802 1.2 matt section->alignment_power = bfd_xcoff_data_align_power (abfd); 1803 1.2 matt else 1804 1.2 matt { 1805 1.2 matt int i; 1806 1.2 matt 1807 1.8 christos for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++) 1808 1.9 christos if (strcmp (bfd_section_name (section), 1809 1.6 christos xcoff_dwsect_names[i].xcoff_name) == 0) 1810 1.6 christos { 1811 1.6 christos section->alignment_power = 0; 1812 1.6 christos sclass = C_DWARF; 1813 1.6 christos break; 1814 1.2 matt } 1815 1.1 skrll } 1816 1.1 skrll #endif 1817 1.1 skrll 1818 1.1 skrll /* Set up the section symbol. */ 1819 1.9 christos if (!_bfd_generic_new_section_hook (abfd, section)) 1820 1.1 skrll return false; 1821 1.1 skrll 1822 1.1 skrll /* Allocate aux records for section symbols, to store size and 1823 1.1 skrll related info. 1824 1.1 skrll 1825 1.1 skrll @@ The 10 is a guess at a plausible maximum number of aux entries 1826 1.1 skrll (but shouldn't be a constant). */ 1827 1.2 matt amt = sizeof (combined_entry_type) * 10; 1828 1.1 skrll native = (combined_entry_type *) bfd_zalloc (abfd, amt); 1829 1.9 christos if (native == NULL) 1830 1.1 skrll return false; 1831 1.1 skrll 1832 1.1 skrll /* We don't need to set up n_name, n_value, or n_scnum in the native 1833 1.1 skrll symbol information, since they'll be overridden by the BFD symbol 1834 1.1 skrll anyhow. However, we do need to set the type and storage class, 1835 1.1 skrll in case this symbol winds up getting written out. The value 0 1836 1.1 skrll for n_numaux is already correct. */ 1837 1.9 christos 1838 1.1 skrll native->is_sym = true; 1839 1.2 matt native->u.syment.n_type = T_NULL; 1840 1.1 skrll native->u.syment.n_sclass = sclass; 1841 1.1 skrll 1842 1.1 skrll coffsymbol (section->symbol)->native = native; 1843 1.1 skrll 1844 1.1 skrll coff_set_custom_section_alignment (abfd, section, 1845 1.1 skrll coff_section_alignment_table, 1846 1.1 skrll coff_section_alignment_table_size); 1847 1.9 christos 1848 1.1 skrll return true; 1849 1.1 skrll } 1850 1.1 skrll 1851 1.1 skrll #ifdef COFF_ALIGN_IN_SECTION_HEADER 1852 1.1 skrll 1853 1.1 skrll /* Set the alignment of a BFD section. */ 1854 1.1 skrll 1855 1.1 skrll static void 1856 1.1 skrll coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED, 1857 1.1 skrll asection * section, 1858 1.1 skrll void * scnhdr) 1859 1.1 skrll { 1860 1.1 skrll struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; 1861 1.1 skrll unsigned int i; 1862 1.1 skrll 1863 1.1 skrll #ifdef COFF_DECODE_ALIGNMENT 1864 1.1 skrll i = COFF_DECODE_ALIGNMENT(hdr->s_flags); 1865 1.1 skrll #endif 1866 1.1 skrll section->alignment_power = i; 1867 1.1 skrll 1868 1.1 skrll #ifdef coff_set_section_load_page 1869 1.1 skrll coff_set_section_load_page (section, hdr->s_page); 1870 1.1 skrll #endif 1871 1.1 skrll } 1872 1.1 skrll 1873 1.1 skrll #else /* ! COFF_ALIGN_IN_SECTION_HEADER */ 1874 1.1 skrll #ifdef COFF_WITH_PE 1875 1.1 skrll 1876 1.1 skrll static void 1877 1.1 skrll coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED, 1878 1.1 skrll asection * section, 1879 1.1 skrll void * scnhdr) 1880 1.1 skrll { 1881 1.9 christos struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; 1882 1.1 skrll size_t amt; 1883 1.1 skrll unsigned int alignment_power_const 1884 1.1 skrll = hdr->s_flags & IMAGE_SCN_ALIGN_POWER_BIT_MASK; 1885 1.1 skrll 1886 1.1 skrll switch (alignment_power_const) 1887 1.1 skrll { 1888 1.1 skrll case IMAGE_SCN_ALIGN_8192BYTES: 1889 1.1 skrll case IMAGE_SCN_ALIGN_4096BYTES: 1890 1.1 skrll case IMAGE_SCN_ALIGN_2048BYTES: 1891 1.1 skrll case IMAGE_SCN_ALIGN_1024BYTES: 1892 1.1 skrll case IMAGE_SCN_ALIGN_512BYTES: 1893 1.1 skrll case IMAGE_SCN_ALIGN_256BYTES: 1894 1.1 skrll case IMAGE_SCN_ALIGN_128BYTES: 1895 1.1 skrll case IMAGE_SCN_ALIGN_64BYTES: 1896 1.1 skrll case IMAGE_SCN_ALIGN_32BYTES: 1897 1.1 skrll case IMAGE_SCN_ALIGN_16BYTES: 1898 1.1 skrll case IMAGE_SCN_ALIGN_8BYTES: 1899 1.1 skrll case IMAGE_SCN_ALIGN_4BYTES: 1900 1.1 skrll case IMAGE_SCN_ALIGN_2BYTES: 1901 1.1 skrll case IMAGE_SCN_ALIGN_1BYTES: 1902 1.1 skrll section->alignment_power 1903 1.1 skrll = IMAGE_SCN_ALIGN_POWER_NUM (alignment_power_const); 1904 1.1 skrll break; 1905 1.1 skrll default: 1906 1.1 skrll break; 1907 1.1 skrll } 1908 1.1 skrll 1909 1.1 skrll /* In a PE image file, the s_paddr field holds the virtual size of a 1910 1.1 skrll section, while the s_size field holds the raw size. We also keep 1911 1.1 skrll the original section flag value, since not every bit can be 1912 1.1 skrll mapped onto a generic BFD section bit. */ 1913 1.1 skrll if (coff_section_data (abfd, section) == NULL) 1914 1.1 skrll { 1915 1.1 skrll amt = sizeof (struct coff_section_tdata); 1916 1.1 skrll section->used_by_bfd = bfd_zalloc (abfd, amt); 1917 1.1 skrll if (section->used_by_bfd == NULL) 1918 1.1 skrll /* FIXME: Return error. */ 1919 1.1 skrll abort (); 1920 1.1 skrll } 1921 1.1 skrll 1922 1.1 skrll if (pei_section_data (abfd, section) == NULL) 1923 1.1 skrll { 1924 1.1 skrll amt = sizeof (struct pei_section_tdata); 1925 1.1 skrll coff_section_data (abfd, section)->tdata = bfd_zalloc (abfd, amt); 1926 1.1 skrll if (coff_section_data (abfd, section)->tdata == NULL) 1927 1.1 skrll /* FIXME: Return error. */ 1928 1.1 skrll abort (); 1929 1.1 skrll } 1930 1.1 skrll pei_section_data (abfd, section)->virt_size = hdr->s_paddr; 1931 1.1 skrll pei_section_data (abfd, section)->pe_flags = hdr->s_flags; 1932 1.1 skrll 1933 1.1 skrll section->lma = hdr->s_vaddr; 1934 1.1 skrll 1935 1.1 skrll /* Check for extended relocs. */ 1936 1.1 skrll if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL) 1937 1.1 skrll { 1938 1.1 skrll struct external_reloc dst; 1939 1.1 skrll struct internal_reloc n; 1940 1.1 skrll file_ptr oldpos = bfd_tell (abfd); 1941 1.1 skrll bfd_size_type relsz = bfd_coff_relsz (abfd); 1942 1.10 christos 1943 1.2 matt if (bfd_seek (abfd, hdr->s_relptr, 0) != 0) 1944 1.10 christos return; 1945 1.1 skrll if (bfd_read (& dst, relsz, abfd) != relsz) 1946 1.1 skrll return; 1947 1.9 christos 1948 1.2 matt bfd_coff_swap_reloc_in (abfd, &dst, &n); 1949 1.2 matt if (bfd_seek (abfd, oldpos, 0) != 0) 1950 1.9 christos return; 1951 1.9 christos if (n.r_vaddr < 0x10000) 1952 1.9 christos { 1953 1.9 christos _bfd_error_handler (_("%pB: overflow reloc count too small"), abfd); 1954 1.9 christos bfd_set_error (bfd_error_bad_value); 1955 1.9 christos return; 1956 1.1 skrll } 1957 1.1 skrll section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1; 1958 1.1 skrll section->rel_filepos += relsz; 1959 1.1 skrll } 1960 1.6 christos else if (hdr->s_nreloc == 0xffff) 1961 1.7 christos _bfd_error_handler 1962 1.6 christos (_("%pB: warning: claims to have 0xffff relocs, without overflow"), 1963 1.1 skrll abfd); 1964 1.1 skrll } 1965 1.1 skrll #undef ALIGN_SET 1966 1.1 skrll #undef ELIFALIGN_SET 1967 1.1 skrll 1968 1.1 skrll #else /* ! COFF_WITH_PE */ 1969 1.1 skrll #ifdef RS6000COFF_C 1970 1.1 skrll 1971 1.1 skrll /* We grossly abuse this function to handle XCOFF overflow headers. 1972 1.1 skrll When we see one, we correct the reloc and line number counts in the 1973 1.1 skrll real header, and remove the section we just created. */ 1974 1.1 skrll 1975 1.1 skrll static void 1976 1.1 skrll coff_set_alignment_hook (bfd *abfd, asection *section, void * scnhdr) 1977 1.1 skrll { 1978 1.1 skrll struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; 1979 1.1 skrll asection *real_sec; 1980 1.1 skrll 1981 1.1 skrll if ((hdr->s_flags & STYP_OVRFLO) == 0) 1982 1.1 skrll return; 1983 1.1 skrll 1984 1.1 skrll real_sec = coff_section_from_bfd_index (abfd, (int) hdr->s_nreloc); 1985 1.1 skrll if (real_sec == NULL) 1986 1.1 skrll return; 1987 1.1 skrll 1988 1.1 skrll real_sec->reloc_count = hdr->s_paddr; 1989 1.1 skrll real_sec->lineno_count = hdr->s_vaddr; 1990 1.1 skrll 1991 1.1 skrll if (!bfd_section_removed_from_list (abfd, section)) 1992 1.1 skrll { 1993 1.1 skrll bfd_section_list_remove (abfd, section); 1994 1.1 skrll --abfd->section_count; 1995 1.1 skrll } 1996 1.1 skrll } 1997 1.1 skrll 1998 1.9 christos #else /* ! RS6000COFF_C */ 1999 1.9 christos #if defined (COFF_GO32_EXE) || defined (COFF_GO32) 2000 1.9 christos 2001 1.9 christos static void 2002 1.9 christos coff_set_alignment_hook (bfd * abfd, asection * section, void * scnhdr) 2003 1.9 christos { 2004 1.9 christos struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; 2005 1.9 christos 2006 1.9 christos /* Check for extended relocs. */ 2007 1.9 christos if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL) 2008 1.9 christos { 2009 1.9 christos struct external_reloc dst; 2010 1.9 christos struct internal_reloc n; 2011 1.9 christos const file_ptr oldpos = bfd_tell (abfd); 2012 1.9 christos const bfd_size_type relsz = bfd_coff_relsz (abfd); 2013 1.10 christos 2014 1.9 christos if (bfd_seek (abfd, hdr->s_relptr, 0) != 0) 2015 1.10 christos return; 2016 1.9 christos if (bfd_read (& dst, relsz, abfd) != relsz) 2017 1.9 christos return; 2018 1.9 christos 2019 1.9 christos bfd_coff_swap_reloc_in (abfd, &dst, &n); 2020 1.9 christos if (bfd_seek (abfd, oldpos, 0) != 0) 2021 1.9 christos return; 2022 1.9 christos section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1; 2023 1.9 christos section->rel_filepos += relsz; 2024 1.9 christos } 2025 1.9 christos else if (hdr->s_nreloc == 0xffff) 2026 1.9 christos _bfd_error_handler 2027 1.9 christos (_("%pB: warning: claims to have 0xffff relocs, without overflow"), 2028 1.9 christos abfd); 2029 1.9 christos } 2030 1.9 christos 2031 1.1 skrll #else /* ! COFF_GO32_EXE && ! COFF_GO32 */ 2032 1.7 christos 2033 1.7 christos static void 2034 1.7 christos coff_set_alignment_hook (bfd *abfd ATTRIBUTE_UNUSED, 2035 1.7 christos asection *section ATTRIBUTE_UNUSED, 2036 1.7 christos void *scnhdr ATTRIBUTE_UNUSED) 2037 1.7 christos { 2038 1.1 skrll } 2039 1.9 christos 2040 1.1 skrll #endif /* ! COFF_GO32_EXE && ! COFF_GO32 */ 2041 1.1 skrll #endif /* ! RS6000COFF_C */ 2042 1.1 skrll #endif /* ! COFF_WITH_PE */ 2043 1.1 skrll #endif /* ! COFF_ALIGN_IN_SECTION_HEADER */ 2044 1.1 skrll 2045 1.1 skrll #ifndef coff_mkobject 2046 1.9 christos 2047 1.1 skrll static bool 2048 1.1 skrll coff_mkobject (bfd * abfd) 2049 1.1 skrll { 2050 1.9 christos coff_data_type *coff; 2051 1.1 skrll size_t amt = sizeof (coff_data_type); 2052 1.1 skrll 2053 1.1 skrll abfd->tdata.coff_obj_data = bfd_zalloc (abfd, amt); 2054 1.9 christos if (abfd->tdata.coff_obj_data == NULL) 2055 1.10 christos return false; 2056 1.1 skrll 2057 1.1 skrll coff = coff_data (abfd); 2058 1.1 skrll coff->symbols = NULL; 2059 1.1 skrll coff->conversion_table = NULL; 2060 1.1 skrll coff->raw_syments = NULL; 2061 1.1 skrll coff->relocbase = 0; 2062 1.1 skrll coff->local_toc_sym_map = 0; 2063 1.10 christos 2064 1.10 christos bfd_coff_long_section_names (abfd) 2065 1.10 christos = coff_backend_info (abfd)->_bfd_coff_long_section_names; 2066 1.1 skrll 2067 1.1 skrll /* make_abs_section(abfd);*/ 2068 1.9 christos 2069 1.1 skrll return true; 2070 1.1 skrll } 2071 1.1 skrll #endif 2072 1.1 skrll 2073 1.1 skrll /* Create the COFF backend specific information. */ 2074 1.1 skrll 2075 1.1 skrll #ifndef coff_mkobject_hook 2076 1.1 skrll static void * 2077 1.1 skrll coff_mkobject_hook (bfd * abfd, 2078 1.1 skrll void * filehdr, 2079 1.1 skrll void * aouthdr ATTRIBUTE_UNUSED) 2080 1.1 skrll { 2081 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 2082 1.1 skrll coff_data_type *coff; 2083 1.1 skrll 2084 1.1 skrll if (! coff_mkobject (abfd)) 2085 1.1 skrll return NULL; 2086 1.1 skrll 2087 1.1 skrll coff = coff_data (abfd); 2088 1.1 skrll 2089 1.1 skrll coff->sym_filepos = internal_f->f_symptr; 2090 1.1 skrll 2091 1.1 skrll /* These members communicate important constants about the symbol 2092 1.1 skrll table to GDB's symbol-reading code. These `constants' 2093 1.1 skrll unfortunately vary among coff implementations... */ 2094 1.1 skrll coff->local_n_btmask = N_BTMASK; 2095 1.1 skrll coff->local_n_btshft = N_BTSHFT; 2096 1.1 skrll coff->local_n_tmask = N_TMASK; 2097 1.1 skrll coff->local_n_tshift = N_TSHIFT; 2098 1.1 skrll coff->local_symesz = bfd_coff_symesz (abfd); 2099 1.1 skrll coff->local_auxesz = bfd_coff_auxesz (abfd); 2100 1.1 skrll coff->local_linesz = bfd_coff_linesz (abfd); 2101 1.1 skrll 2102 1.1 skrll coff->timestamp = internal_f->f_timdat; 2103 1.1 skrll 2104 1.1 skrll obj_raw_syment_count (abfd) = 2105 1.1 skrll obj_conv_table_size (abfd) = 2106 1.1 skrll internal_f->f_nsyms; 2107 1.1 skrll 2108 1.1 skrll #ifdef RS6000COFF_C 2109 1.1 skrll if ((internal_f->f_flags & F_SHROBJ) != 0) 2110 1.1 skrll abfd->flags |= DYNAMIC; 2111 1.1 skrll if (aouthdr != NULL && internal_f->f_opthdr >= bfd_coff_aoutsz (abfd)) 2112 1.1 skrll { 2113 1.1 skrll struct internal_aouthdr *internal_a = 2114 1.1 skrll (struct internal_aouthdr *) aouthdr; 2115 1.1 skrll struct xcoff_tdata *xcoff; 2116 1.1 skrll 2117 1.1 skrll xcoff = xcoff_data (abfd); 2118 1.1 skrll # ifdef U803XTOCMAGIC 2119 1.1 skrll xcoff->xcoff64 = internal_f->f_magic == U803XTOCMAGIC; 2120 1.1 skrll # else 2121 1.1 skrll xcoff->xcoff64 = 0; 2122 1.9 christos # endif 2123 1.1 skrll xcoff->full_aouthdr = true; 2124 1.1 skrll xcoff->toc = internal_a->o_toc; 2125 1.1 skrll xcoff->sntoc = internal_a->o_sntoc; 2126 1.1 skrll xcoff->snentry = internal_a->o_snentry; 2127 1.1 skrll bfd_xcoff_text_align_power (abfd) = internal_a->o_algntext; 2128 1.1 skrll bfd_xcoff_data_align_power (abfd) = internal_a->o_algndata; 2129 1.1 skrll xcoff->modtype = internal_a->o_modtype; 2130 1.1 skrll xcoff->cputype = internal_a->o_cputype; 2131 1.1 skrll xcoff->maxdata = internal_a->o_maxdata; 2132 1.1 skrll xcoff->maxstack = internal_a->o_maxstack; 2133 1.1 skrll } 2134 1.1 skrll #endif 2135 1.1 skrll 2136 1.1 skrll #ifdef ARM 2137 1.1 skrll /* Set the flags field from the COFF header read in. */ 2138 1.1 skrll if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags)) 2139 1.1 skrll coff->flags = 0; 2140 1.1 skrll #endif 2141 1.1 skrll 2142 1.1 skrll #ifdef COFF_WITH_PE 2143 1.1 skrll /* FIXME: I'm not sure this is ever executed, since peicode.h 2144 1.1 skrll defines coff_mkobject_hook. */ 2145 1.1 skrll if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0) 2146 1.1 skrll abfd->flags |= HAS_DEBUG; 2147 1.1 skrll #endif 2148 1.1 skrll 2149 1.1 skrll return coff; 2150 1.1 skrll } 2151 1.1 skrll #endif 2152 1.1 skrll 2153 1.1 skrll /* Determine the machine architecture and type. FIXME: This is target 2154 1.1 skrll dependent because the magic numbers are defined in the target 2155 1.1 skrll dependent header files. But there is no particular need for this. 2156 1.1 skrll If the magic numbers were moved to a separate file, this function 2157 1.1 skrll would be target independent and would also be much more successful 2158 1.1 skrll at linking together COFF files for different architectures. */ 2159 1.9 christos 2160 1.1 skrll static bool 2161 1.1 skrll coff_set_arch_mach_hook (bfd *abfd, void * filehdr) 2162 1.1 skrll { 2163 1.1 skrll unsigned long machine; 2164 1.1 skrll enum bfd_architecture arch; 2165 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; 2166 1.1 skrll 2167 1.1 skrll /* Zero selects the default machine for an arch. */ 2168 1.1 skrll machine = 0; 2169 1.1 skrll switch (internal_f->f_magic) 2170 1.1 skrll { 2171 1.1 skrll #ifdef I386MAGIC 2172 1.1 skrll case I386MAGIC: 2173 1.1 skrll case I386PTXMAGIC: 2174 1.7 christos case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler. */ 2175 1.8 christos case LYNXCOFFMAGIC: 2176 1.8 christos case I386_APPLE_MAGIC: 2177 1.8 christos case I386_FREEBSD_MAGIC: 2178 1.8 christos case I386_LINUX_MAGIC: 2179 1.1 skrll case I386_NETBSD_MAGIC: 2180 1.1 skrll arch = bfd_arch_i386; 2181 1.1 skrll break; 2182 1.1 skrll #endif 2183 1.1 skrll #ifdef AMD64MAGIC 2184 1.8 christos case AMD64MAGIC: 2185 1.8 christos case AMD64_APPLE_MAGIC: 2186 1.8 christos case AMD64_FREEBSD_MAGIC: 2187 1.8 christos case AMD64_LINUX_MAGIC: 2188 1.1 skrll case AMD64_NETBSD_MAGIC: 2189 1.1 skrll arch = bfd_arch_i386; 2190 1.1 skrll machine = bfd_mach_x86_64; 2191 1.1 skrll break; 2192 1.1 skrll #endif 2193 1.1 skrll #ifdef IA64MAGIC 2194 1.1 skrll case IA64MAGIC: 2195 1.1 skrll arch = bfd_arch_ia64; 2196 1.1 skrll break; 2197 1.1 skrll #endif 2198 1.1 skrll #ifdef ARMMAGIC 2199 1.1 skrll case ARMMAGIC: 2200 1.1 skrll case ARMPEMAGIC: 2201 1.1 skrll case THUMBPEMAGIC: 2202 1.1 skrll arch = bfd_arch_arm; 2203 1.1 skrll machine = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION); 2204 1.1 skrll if (machine == bfd_mach_arm_unknown) 2205 1.1 skrll { 2206 1.1 skrll switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK) 2207 1.1 skrll { 2208 1.1 skrll case F_ARM_2: machine = bfd_mach_arm_2; break; 2209 1.1 skrll case F_ARM_2a: machine = bfd_mach_arm_2a; break; 2210 1.1 skrll case F_ARM_3: machine = bfd_mach_arm_3; break; 2211 1.1 skrll default: 2212 1.1 skrll case F_ARM_3M: machine = bfd_mach_arm_3M; break; 2213 1.1 skrll case F_ARM_4: machine = bfd_mach_arm_4; break; 2214 1.1 skrll case F_ARM_4T: machine = bfd_mach_arm_4T; break; 2215 1.1 skrll /* The COFF header does not have enough bits available 2216 1.1 skrll to cover all the different ARM architectures. So 2217 1.1 skrll we interpret F_ARM_5, the highest flag value to mean 2218 1.1 skrll "the highest ARM architecture known to BFD" which is 2219 1.1 skrll currently the XScale. */ 2220 1.1 skrll case F_ARM_5: machine = bfd_mach_arm_XScale; break; 2221 1.1 skrll } 2222 1.1 skrll } 2223 1.1 skrll break; 2224 1.9 christos #endif 2225 1.9 christos #ifdef AARCH64MAGIC 2226 1.9 christos case AARCH64MAGIC: 2227 1.9 christos arch = bfd_arch_aarch64; 2228 1.9 christos machine = internal_f->f_flags & F_AARCH64_ARCHITECTURE_MASK; 2229 1.9 christos break; 2230 1.10 christos #endif 2231 1.10 christos #ifdef LOONGARCH64MAGIC 2232 1.10 christos case LOONGARCH64MAGIC: 2233 1.10 christos arch = bfd_arch_loongarch; 2234 1.10 christos machine = internal_f->f_flags & F_LOONGARCH64_ARCHITECTURE_MASK; 2235 1.10 christos break; 2236 1.10 christos #endif 2237 1.10 christos #ifdef RISCV64MAGIC 2238 1.10 christos case RISCV64MAGIC: 2239 1.10 christos arch = bfd_arch_riscv; 2240 1.10 christos machine = bfd_mach_riscv64; 2241 1.10 christos break; 2242 1.1 skrll #endif 2243 1.1 skrll #ifdef Z80MAGIC 2244 1.1 skrll case Z80MAGIC: 2245 1.1 skrll arch = bfd_arch_z80; 2246 1.1 skrll switch (internal_f->f_flags & F_MACHMASK) 2247 1.1 skrll { 2248 1.1 skrll case bfd_mach_z80strict << 12: 2249 1.9 christos case bfd_mach_z80 << 12: 2250 1.1 skrll case bfd_mach_z80n << 12: 2251 1.1 skrll case bfd_mach_z80full << 12: 2252 1.8 christos case bfd_mach_r800 << 12: 2253 1.8 christos case bfd_mach_gbz80 << 12: 2254 1.8 christos case bfd_mach_z180 << 12: 2255 1.8 christos case bfd_mach_ez80_z80 << 12: 2256 1.1 skrll case bfd_mach_ez80_adl << 12: 2257 1.1 skrll machine = ((unsigned)internal_f->f_flags & F_MACHMASK) >> 12; 2258 1.1 skrll break; 2259 1.9 christos default: 2260 1.1 skrll return false; 2261 1.1 skrll } 2262 1.1 skrll break; 2263 1.1 skrll #endif 2264 1.1 skrll #ifdef Z8KMAGIC 2265 1.1 skrll case Z8KMAGIC: 2266 1.1 skrll arch = bfd_arch_z8k; 2267 1.1 skrll switch (internal_f->f_flags & F_MACHMASK) 2268 1.1 skrll { 2269 1.1 skrll case F_Z8001: 2270 1.1 skrll machine = bfd_mach_z8001; 2271 1.1 skrll break; 2272 1.1 skrll case F_Z8002: 2273 1.1 skrll machine = bfd_mach_z8002; 2274 1.1 skrll break; 2275 1.9 christos default: 2276 1.1 skrll return false; 2277 1.1 skrll } 2278 1.1 skrll break; 2279 1.1 skrll #endif 2280 1.1 skrll 2281 1.1 skrll #ifdef RS6000COFF_C 2282 1.1 skrll #ifdef XCOFF64 2283 1.1 skrll case U64_TOCMAGIC: 2284 1.1 skrll case U803XTOCMAGIC: 2285 1.1 skrll #else 2286 1.1 skrll case U802ROMAGIC: 2287 1.1 skrll case U802WRMAGIC: 2288 1.1 skrll case U802TOCMAGIC: 2289 1.1 skrll #endif 2290 1.1 skrll { 2291 1.1 skrll int cputype; 2292 1.1 skrll 2293 1.1 skrll if (xcoff_data (abfd)->cputype != -1) 2294 1.1 skrll cputype = xcoff_data (abfd)->cputype & 0xff; 2295 1.1 skrll else 2296 1.1 skrll { 2297 1.1 skrll /* We did not get a value from the a.out header. If the 2298 1.1 skrll file has not been stripped, we may be able to get the 2299 1.1 skrll architecture information from the first symbol, if it 2300 1.1 skrll is a .file symbol. */ 2301 1.1 skrll if (obj_raw_syment_count (abfd) == 0) 2302 1.1 skrll cputype = 0; 2303 1.1 skrll else 2304 1.1 skrll { 2305 1.1 skrll bfd_byte *buf; 2306 1.1 skrll struct internal_syment sym; 2307 1.1 skrll bfd_size_type amt = bfd_coff_symesz (abfd); 2308 1.9 christos 2309 1.9 christos if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) 2310 1.9 christos return false; 2311 1.3 christos buf = _bfd_malloc_and_read (abfd, amt, amt); 2312 1.9 christos if (buf == NULL) 2313 1.1 skrll return false; 2314 1.1 skrll bfd_coff_swap_sym_in (abfd, buf, & sym); 2315 1.1 skrll if (sym.n_sclass == C_FILE) 2316 1.1 skrll cputype = sym.n_type & 0xff; 2317 1.1 skrll else 2318 1.1 skrll cputype = 0; 2319 1.1 skrll free (buf); 2320 1.1 skrll } 2321 1.1 skrll } 2322 1.1 skrll 2323 1.1 skrll /* FIXME: We don't handle all cases here. */ 2324 1.1 skrll switch (cputype) 2325 1.1 skrll { 2326 1.1 skrll default: 2327 1.1 skrll case 0: 2328 1.1 skrll arch = bfd_xcoff_architecture (abfd); 2329 1.1 skrll machine = bfd_xcoff_machine (abfd); 2330 1.1 skrll break; 2331 1.1 skrll 2332 1.1 skrll case 1: 2333 1.1 skrll arch = bfd_arch_powerpc; 2334 1.1 skrll machine = bfd_mach_ppc_601; 2335 1.1 skrll break; 2336 1.1 skrll case 2: /* 64 bit PowerPC */ 2337 1.1 skrll arch = bfd_arch_powerpc; 2338 1.1 skrll machine = bfd_mach_ppc_620; 2339 1.1 skrll break; 2340 1.1 skrll case 3: 2341 1.1 skrll arch = bfd_arch_powerpc; 2342 1.1 skrll machine = bfd_mach_ppc; 2343 1.1 skrll break; 2344 1.1 skrll case 4: 2345 1.1 skrll arch = bfd_arch_rs6000; 2346 1.1 skrll machine = bfd_mach_rs6k; 2347 1.1 skrll break; 2348 1.1 skrll } 2349 1.1 skrll } 2350 1.1 skrll break; 2351 1.1 skrll #endif 2352 1.1 skrll 2353 1.1 skrll #ifdef SH_ARCH_MAGIC_BIG 2354 1.1 skrll case SH_ARCH_MAGIC_BIG: 2355 1.1 skrll case SH_ARCH_MAGIC_LITTLE: 2356 1.1 skrll #ifdef COFF_WITH_PE 2357 1.1 skrll case SH_ARCH_MAGIC_WINCE: 2358 1.1 skrll #endif 2359 1.1 skrll arch = bfd_arch_sh; 2360 1.1 skrll break; 2361 1.1 skrll #endif 2362 1.1 skrll 2363 1.1 skrll #ifdef MIPS_ARCH_MAGIC_WINCE 2364 1.1 skrll case MIPS_ARCH_MAGIC_WINCE: 2365 1.1 skrll arch = bfd_arch_mips; 2366 1.1 skrll break; 2367 1.1 skrll #endif 2368 1.1 skrll 2369 1.1 skrll #ifdef SPARCMAGIC 2370 1.1 skrll case SPARCMAGIC: 2371 1.1 skrll #ifdef LYNXCOFFMAGIC 2372 1.1 skrll case LYNXCOFFMAGIC: 2373 1.1 skrll #endif 2374 1.1 skrll arch = bfd_arch_sparc; 2375 1.1 skrll break; 2376 1.1 skrll #endif 2377 1.1 skrll 2378 1.1 skrll #ifdef TIC30MAGIC 2379 1.1 skrll case TIC30MAGIC: 2380 1.1 skrll arch = bfd_arch_tic30; 2381 1.1 skrll break; 2382 1.1 skrll #endif 2383 1.1 skrll 2384 1.1 skrll #ifdef TICOFF0MAGIC 2385 1.1 skrll #ifdef TICOFF_TARGET_ARCH 2386 1.1 skrll /* This TI COFF section should be used by all new TI COFF v0 targets. */ 2387 1.1 skrll case TICOFF0MAGIC: 2388 1.1 skrll arch = TICOFF_TARGET_ARCH; 2389 1.1 skrll machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags); 2390 1.1 skrll break; 2391 1.1 skrll #endif 2392 1.1 skrll #endif 2393 1.1 skrll 2394 1.1 skrll #ifdef TICOFF1MAGIC 2395 1.1 skrll /* This TI COFF section should be used by all new TI COFF v1/2 targets. */ 2396 1.1 skrll /* TI COFF1 and COFF2 use the target_id field to specify which arch. */ 2397 1.1 skrll case TICOFF1MAGIC: 2398 1.1 skrll case TICOFF2MAGIC: 2399 1.1 skrll switch (internal_f->f_target_id) 2400 1.1 skrll { 2401 1.1 skrll #ifdef TI_TARGET_ID 2402 1.1 skrll case TI_TARGET_ID: 2403 1.1 skrll arch = TICOFF_TARGET_ARCH; 2404 1.1 skrll machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags); 2405 1.1 skrll break; 2406 1.1 skrll #endif 2407 1.1 skrll default: 2408 1.6 christos arch = bfd_arch_obscure; 2409 1.7 christos _bfd_error_handler 2410 1.1 skrll (_("unrecognized TI COFF target id '0x%x'"), 2411 1.1 skrll internal_f->f_target_id); 2412 1.1 skrll break; 2413 1.1 skrll } 2414 1.1 skrll break; 2415 1.1 skrll #endif 2416 1.1 skrll 2417 1.1 skrll #ifdef MCOREMAGIC 2418 1.1 skrll case MCOREMAGIC: 2419 1.1 skrll arch = bfd_arch_mcore; 2420 1.1 skrll break; 2421 1.1 skrll #endif 2422 1.1 skrll 2423 1.1 skrll default: /* Unreadable input file type. */ 2424 1.1 skrll arch = bfd_arch_obscure; 2425 1.1 skrll break; 2426 1.1 skrll } 2427 1.1 skrll 2428 1.9 christos bfd_default_set_arch_mach (abfd, arch, machine); 2429 1.1 skrll return true; 2430 1.1 skrll } 2431 1.9 christos 2432 1.7 christos static bool 2433 1.7 christos symname_in_debug_hook (bfd *abfd ATTRIBUTE_UNUSED, 2434 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED) 2435 1.7 christos { 2436 1.1 skrll #ifdef SYMNAME_IN_DEBUG 2437 1.1 skrll return SYMNAME_IN_DEBUG (sym) != 0; 2438 1.9 christos #else 2439 1.1 skrll return false; 2440 1.7 christos #endif 2441 1.1 skrll } 2442 1.1 skrll 2443 1.1 skrll #ifdef RS6000COFF_C 2444 1.1 skrll 2445 1.1 skrll #ifdef XCOFF64 2446 1.1 skrll #define FORCE_SYMNAMES_IN_STRINGS 2447 1.1 skrll #endif 2448 1.2 matt 2449 1.1 skrll /* Handle the csect auxent of a C_EXT, C_AIX_WEAKEXT or C_HIDEXT symbol. */ 2450 1.9 christos 2451 1.1 skrll static bool 2452 1.1 skrll coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED, 2453 1.1 skrll combined_entry_type *table_base, 2454 1.1 skrll combined_entry_type *symbol, 2455 1.1 skrll unsigned int indaux, 2456 1.1 skrll combined_entry_type *aux) 2457 1.3 christos { 2458 1.2 matt BFD_ASSERT (symbol->is_sym); 2459 1.1 skrll int n_sclass = symbol->u.syment.n_sclass; 2460 1.2 matt 2461 1.1 skrll if (CSECT_SYM_P (n_sclass) 2462 1.1 skrll && indaux + 1 == symbol->u.syment.n_numaux) 2463 1.3 christos { 2464 1.10 christos BFD_ASSERT (! aux->is_sym); 2465 1.10 christos if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD 2466 1.1 skrll && aux->u.auxent.x_csect.x_scnlen.u64 < obj_raw_syment_count (abfd)) 2467 1.1 skrll { 2468 1.10 christos aux->u.auxent.x_csect.x_scnlen.p = 2469 1.1 skrll table_base + aux->u.auxent.x_csect.x_scnlen.u64; 2470 1.1 skrll aux->fix_scnlen = 1; 2471 1.1 skrll } 2472 1.1 skrll 2473 1.1 skrll /* Return TRUE to indicate that the caller should not do any 2474 1.9 christos further work on this auxent. */ 2475 1.1 skrll return true; 2476 1.1 skrll } 2477 1.1 skrll 2478 1.1 skrll /* Return FALSE to indicate that this auxent should be handled by 2479 1.9 christos the caller. */ 2480 1.1 skrll return false; 2481 1.1 skrll } 2482 1.1 skrll 2483 1.1 skrll #else 2484 1.1 skrll #define coff_pointerize_aux_hook 0 2485 1.1 skrll #endif /* ! RS6000COFF_C */ 2486 1.1 skrll 2487 1.1 skrll /* Print an aux entry. This returns TRUE if it has printed it. */ 2488 1.9 christos 2489 1.1 skrll static bool 2490 1.1 skrll coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED, 2491 1.1 skrll FILE *file ATTRIBUTE_UNUSED, 2492 1.1 skrll combined_entry_type *table_base ATTRIBUTE_UNUSED, 2493 1.1 skrll combined_entry_type *symbol ATTRIBUTE_UNUSED, 2494 1.1 skrll combined_entry_type *aux ATTRIBUTE_UNUSED, 2495 1.1 skrll unsigned int indaux ATTRIBUTE_UNUSED) 2496 1.3 christos { 2497 1.3 christos BFD_ASSERT (symbol->is_sym); 2498 1.1 skrll BFD_ASSERT (! aux->is_sym); 2499 1.2 matt #ifdef RS6000COFF_C 2500 1.1 skrll if (CSECT_SYM_P (symbol->u.syment.n_sclass) 2501 1.1 skrll && indaux + 1 == symbol->u.syment.n_numaux) 2502 1.1 skrll { 2503 1.1 skrll /* This is a csect entry. */ 2504 1.1 skrll fprintf (file, "AUX "); 2505 1.1 skrll if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD) 2506 1.1 skrll { 2507 1.10 christos BFD_ASSERT (! aux->fix_scnlen); 2508 1.10 christos fprintf (file, "val %5" PRIu64, 2509 1.1 skrll aux->u.auxent.x_csect.x_scnlen.u64); 2510 1.1 skrll } 2511 1.1 skrll else 2512 1.1 skrll { 2513 1.1 skrll fprintf (file, "indx "); 2514 1.10 christos if (! aux->fix_scnlen) 2515 1.10 christos fprintf (file, "%4" PRIu64, 2516 1.1 skrll aux->u.auxent.x_csect.x_scnlen.u64); 2517 1.1 skrll else 2518 1.1 skrll fprintf (file, "%4ld", 2519 1.1 skrll (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base)); 2520 1.1 skrll } 2521 1.10 christos fprintf (file, 2522 1.1 skrll " prmhsh %u snhsh %u typ %d algn %d clss %u stb %u snstb %u", 2523 1.1 skrll aux->u.auxent.x_csect.x_parmhash, 2524 1.1 skrll (unsigned int) aux->u.auxent.x_csect.x_snhash, 2525 1.1 skrll SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp), 2526 1.1 skrll SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp), 2527 1.1 skrll (unsigned int) aux->u.auxent.x_csect.x_smclas, 2528 1.1 skrll aux->u.auxent.x_csect.x_stab, 2529 1.9 christos (unsigned int) aux->u.auxent.x_csect.x_snstab); 2530 1.1 skrll return true; 2531 1.1 skrll } 2532 1.1 skrll #endif 2533 1.1 skrll 2534 1.9 christos /* Return FALSE to indicate that no special action was taken. */ 2535 1.1 skrll return false; 2536 1.1 skrll } 2537 1.1 skrll 2538 1.1 skrll /* 2539 1.1 skrll SUBSUBSECTION 2540 1.1 skrll Writing relocations 2541 1.1 skrll 2542 1.1 skrll To write relocations, the back end steps though the 2543 1.1 skrll canonical relocation table and create an 2544 1.1 skrll @code{internal_reloc}. The symbol index to use is removed from 2545 1.1 skrll the @code{offset} field in the symbol table supplied. The 2546 1.1 skrll address comes directly from the sum of the section base 2547 1.1 skrll address and the relocation offset; the type is dug directly 2548 1.1 skrll from the howto field. Then the @code{internal_reloc} is 2549 1.1 skrll swapped into the shape of an @code{external_reloc} and written 2550 1.1 skrll out to disk. 2551 1.1 skrll 2552 1.1 skrll */ 2553 1.1 skrll 2554 1.1 skrll #ifdef TARG_AUX 2555 1.1 skrll 2556 1.1 skrll 2557 1.1 skrll /* AUX's ld wants relocations to be sorted. */ 2558 1.1 skrll static int 2559 1.1 skrll compare_arelent_ptr (const void * x, const void * y) 2560 1.1 skrll { 2561 1.1 skrll const arelent **a = (const arelent **) x; 2562 1.1 skrll const arelent **b = (const arelent **) y; 2563 1.1 skrll bfd_size_type aadr = (*a)->address; 2564 1.1 skrll bfd_size_type badr = (*b)->address; 2565 1.1 skrll 2566 1.1 skrll return (aadr < badr ? -1 : badr < aadr ? 1 : 0); 2567 1.1 skrll } 2568 1.1 skrll 2569 1.1 skrll #endif /* TARG_AUX */ 2570 1.9 christos 2571 1.1 skrll static bool 2572 1.1 skrll coff_write_relocs (bfd * abfd, int first_undef) 2573 1.1 skrll { 2574 1.1 skrll asection *s; 2575 1.1 skrll 2576 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next) 2577 1.1 skrll { 2578 1.1 skrll unsigned int i; 2579 1.1 skrll struct external_reloc dst; 2580 1.1 skrll arelent **p; 2581 1.1 skrll 2582 1.1 skrll #ifndef TARG_AUX 2583 1.1 skrll p = s->orelocation; 2584 1.1 skrll #else 2585 1.1 skrll { 2586 1.1 skrll /* Sort relocations before we write them out. */ 2587 1.1 skrll bfd_size_type amt; 2588 1.1 skrll 2589 1.1 skrll amt = s->reloc_count; 2590 1.1 skrll amt *= sizeof (arelent *); 2591 1.3 christos p = bfd_malloc (amt); 2592 1.3 christos if (p == NULL) 2593 1.3 christos { 2594 1.9 christos if (s->reloc_count > 0) 2595 1.3 christos return false; 2596 1.3 christos } 2597 1.3 christos else 2598 1.3 christos { 2599 1.3 christos memcpy (p, s->orelocation, (size_t) amt); 2600 1.3 christos qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr); 2601 1.1 skrll } 2602 1.1 skrll } 2603 1.1 skrll #endif 2604 1.1 skrll 2605 1.9 christos if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0) 2606 1.1 skrll return false; 2607 1.9 christos 2608 1.9 christos #ifdef COFF_WITH_EXTENDED_RELOC_COUNTER 2609 1.1 skrll if ((obj_pe (abfd) || obj_go32 (abfd)) && s->reloc_count >= 0xffff) 2610 1.1 skrll { 2611 1.1 skrll /* Encode real count here as first reloc. */ 2612 1.1 skrll struct internal_reloc n; 2613 1.1 skrll 2614 1.1 skrll memset (& n, 0, sizeof (n)); 2615 1.1 skrll /* Add one to count *this* reloc (grr). */ 2616 1.1 skrll n.r_vaddr = s->reloc_count + 1; 2617 1.10 christos coff_swap_reloc_out (abfd, &n, &dst); 2618 1.10 christos if (bfd_write (&dst, bfd_coff_relsz (abfd), abfd) 2619 1.9 christos != bfd_coff_relsz (abfd)) 2620 1.1 skrll return false; 2621 1.1 skrll } 2622 1.1 skrll #endif 2623 1.1 skrll 2624 1.1 skrll for (i = 0; i < s->reloc_count; i++) 2625 1.1 skrll { 2626 1.1 skrll struct internal_reloc n; 2627 1.1 skrll arelent *q = p[i]; 2628 1.1 skrll 2629 1.1 skrll memset (& n, 0, sizeof (n)); 2630 1.1 skrll 2631 1.1 skrll /* Now we've renumbered the symbols we know where the 2632 1.1 skrll undefined symbols live in the table. Check the reloc 2633 1.1 skrll entries for symbols who's output bfd isn't the right one. 2634 1.1 skrll This is because the symbol was undefined (which means 2635 1.1 skrll that all the pointers are never made to point to the same 2636 1.1 skrll place). This is a bad thing,'cause the symbols attached 2637 1.1 skrll to the output bfd are indexed, so that the relocation 2638 1.1 skrll entries know which symbol index they point to. So we 2639 1.1 skrll have to look up the output symbol here. */ 2640 1.2 matt 2641 1.1 skrll if (q->sym_ptr_ptr[0] != NULL && q->sym_ptr_ptr[0]->the_bfd != abfd) 2642 1.1 skrll { 2643 1.1 skrll int j; 2644 1.1 skrll const char *sname = q->sym_ptr_ptr[0]->name; 2645 1.1 skrll asymbol **outsyms = abfd->outsymbols; 2646 1.1 skrll 2647 1.1 skrll for (j = first_undef; outsyms[j]; j++) 2648 1.1 skrll { 2649 1.1 skrll const char *intable = outsyms[j]->name; 2650 1.1 skrll 2651 1.1 skrll if (strcmp (intable, sname) == 0) 2652 1.1 skrll { 2653 1.1 skrll /* Got a hit, so repoint the reloc. */ 2654 1.1 skrll q->sym_ptr_ptr = outsyms + j; 2655 1.1 skrll break; 2656 1.1 skrll } 2657 1.1 skrll } 2658 1.1 skrll } 2659 1.1 skrll 2660 1.1 skrll n.r_vaddr = q->address + s->vma; 2661 1.1 skrll 2662 1.1 skrll #ifdef R_IHCONST 2663 1.1 skrll /* The 29k const/consth reloc pair is a real kludge. The consth 2664 1.1 skrll part doesn't have a symbol; it has an offset. So rebuilt 2665 1.1 skrll that here. */ 2666 1.1 skrll if (q->howto->type == R_IHCONST) 2667 1.1 skrll n.r_symndx = q->addend; 2668 1.1 skrll else 2669 1.2 matt #endif 2670 1.1 skrll if (q->sym_ptr_ptr && q->sym_ptr_ptr[0] != NULL) 2671 1.1 skrll { 2672 1.1 skrll #ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P 2673 1.1 skrll if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q, s)) 2674 1.1 skrll #else 2675 1.1 skrll if ((*q->sym_ptr_ptr)->section == bfd_abs_section_ptr 2676 1.1 skrll && ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0) 2677 1.1 skrll #endif 2678 1.1 skrll /* This is a relocation relative to the absolute symbol. */ 2679 1.1 skrll n.r_symndx = -1; 2680 1.1 skrll else 2681 1.1 skrll { 2682 1.1 skrll n.r_symndx = get_index ((*(q->sym_ptr_ptr))); 2683 1.1 skrll /* Check to see if the symbol reloc points to a symbol 2684 1.1 skrll we don't have in our symbol table. */ 2685 1.1 skrll if (n.r_symndx > obj_conv_table_size (abfd)) 2686 1.1 skrll { 2687 1.6 christos bfd_set_error (bfd_error_bad_value); 2688 1.7 christos /* xgettext:c-format */ 2689 1.6 christos _bfd_error_handler (_("%pB: reloc against a non-existent" 2690 1.1 skrll " symbol index: %ld"), 2691 1.9 christos abfd, n.r_symndx); 2692 1.1 skrll return false; 2693 1.1 skrll } 2694 1.1 skrll } 2695 1.1 skrll } 2696 1.1 skrll 2697 1.1 skrll #ifdef SWAP_OUT_RELOC_OFFSET 2698 1.1 skrll n.r_offset = q->addend; 2699 1.1 skrll #endif 2700 1.1 skrll 2701 1.1 skrll #ifdef SELECT_RELOC 2702 1.9 christos /* Work out reloc type from what is required. */ 2703 1.9 christos if (q->howto) 2704 1.1 skrll SELECT_RELOC (n, q->howto); 2705 1.9 christos #else 2706 1.9 christos if (q->howto) 2707 1.1 skrll n.r_type = q->howto->type; 2708 1.1 skrll #endif 2709 1.1 skrll coff_swap_reloc_out (abfd, &n, &dst); 2710 1.10 christos 2711 1.10 christos if (bfd_write (&dst, bfd_coff_relsz (abfd), abfd) 2712 1.9 christos != bfd_coff_relsz (abfd)) 2713 1.1 skrll return false; 2714 1.1 skrll } 2715 1.1 skrll 2716 1.9 christos #ifdef TARG_AUX 2717 1.1 skrll free (p); 2718 1.1 skrll #endif 2719 1.1 skrll } 2720 1.9 christos 2721 1.1 skrll return true; 2722 1.1 skrll } 2723 1.1 skrll 2724 1.1 skrll /* Set flags and magic number of a coff file from architecture and machine 2725 1.1 skrll type. Result is TRUE if we can represent the arch&type, FALSE if not. */ 2726 1.9 christos 2727 1.1 skrll static bool 2728 1.1 skrll coff_set_flags (bfd * abfd, 2729 1.1 skrll unsigned int *magicp ATTRIBUTE_UNUSED, 2730 1.1 skrll unsigned short *flagsp ATTRIBUTE_UNUSED) 2731 1.1 skrll { 2732 1.1 skrll switch (bfd_get_arch (abfd)) 2733 1.1 skrll { 2734 1.1 skrll #ifdef Z80MAGIC 2735 1.1 skrll case bfd_arch_z80: 2736 1.1 skrll *magicp = Z80MAGIC; 2737 1.1 skrll switch (bfd_get_mach (abfd)) 2738 1.1 skrll { 2739 1.1 skrll case bfd_mach_z80strict: 2740 1.9 christos case bfd_mach_z80: 2741 1.1 skrll case bfd_mach_z80n: 2742 1.1 skrll case bfd_mach_z80full: 2743 1.8 christos case bfd_mach_r800: 2744 1.8 christos case bfd_mach_gbz80: 2745 1.8 christos case bfd_mach_z180: 2746 1.8 christos case bfd_mach_ez80_z80: 2747 1.1 skrll case bfd_mach_ez80_adl: 2748 1.1 skrll *flagsp = bfd_get_mach (abfd) << 12; 2749 1.1 skrll break; 2750 1.9 christos default: 2751 1.1 skrll return false; 2752 1.9 christos } 2753 1.1 skrll return true; 2754 1.1 skrll #endif 2755 1.1 skrll 2756 1.1 skrll #ifdef Z8KMAGIC 2757 1.1 skrll case bfd_arch_z8k: 2758 1.1 skrll *magicp = Z8KMAGIC; 2759 1.1 skrll 2760 1.1 skrll switch (bfd_get_mach (abfd)) 2761 1.1 skrll { 2762 1.1 skrll case bfd_mach_z8001: *flagsp = F_Z8001; break; 2763 1.9 christos case bfd_mach_z8002: *flagsp = F_Z8002; break; 2764 1.1 skrll default: return false; 2765 1.9 christos } 2766 1.1 skrll return true; 2767 1.1 skrll #endif 2768 1.1 skrll 2769 1.1 skrll #ifdef TIC30MAGIC 2770 1.1 skrll case bfd_arch_tic30: 2771 1.9 christos *magicp = TIC30MAGIC; 2772 1.1 skrll return true; 2773 1.1 skrll #endif 2774 1.1 skrll 2775 1.1 skrll #ifdef TICOFF_DEFAULT_MAGIC 2776 1.1 skrll case TICOFF_TARGET_ARCH: 2777 1.1 skrll /* If there's no indication of which version we want, use the default. */ 2778 1.1 skrll if (!abfd->xvec ) 2779 1.1 skrll *magicp = TICOFF_DEFAULT_MAGIC; 2780 1.1 skrll else 2781 1.1 skrll { 2782 1.1 skrll /* We may want to output in a different COFF version. */ 2783 1.1 skrll switch (abfd->xvec->name[4]) 2784 1.1 skrll { 2785 1.1 skrll case '0': 2786 1.1 skrll *magicp = TICOFF0MAGIC; 2787 1.1 skrll break; 2788 1.1 skrll case '1': 2789 1.1 skrll *magicp = TICOFF1MAGIC; 2790 1.1 skrll break; 2791 1.1 skrll case '2': 2792 1.1 skrll *magicp = TICOFF2MAGIC; 2793 1.1 skrll break; 2794 1.9 christos default: 2795 1.1 skrll return false; 2796 1.1 skrll } 2797 1.1 skrll } 2798 1.9 christos TICOFF_TARGET_MACHINE_SET (flagsp, bfd_get_mach (abfd)); 2799 1.9 christos return true; 2800 1.9 christos #endif 2801 1.9 christos 2802 1.9 christos #ifdef AARCH64MAGIC 2803 1.9 christos case bfd_arch_aarch64: 2804 1.9 christos * magicp = AARCH64MAGIC; 2805 1.1 skrll return true; 2806 1.1 skrll #endif 2807 1.10 christos 2808 1.10 christos #ifdef LOONGARCH64MAGIC 2809 1.10 christos case bfd_arch_loongarch: 2810 1.10 christos * magicp = LOONGARCH64MAGIC; 2811 1.10 christos return true; 2812 1.10 christos #endif 2813 1.10 christos 2814 1.10 christos #ifdef RISCV64MAGIC 2815 1.10 christos case bfd_arch_riscv: 2816 1.10 christos * magicp = RISCV64MAGIC; 2817 1.10 christos return true; 2818 1.10 christos #endif 2819 1.1 skrll 2820 1.1 skrll #ifdef ARMMAGIC 2821 1.1 skrll case bfd_arch_arm: 2822 1.1 skrll #ifdef ARM_WINCE 2823 1.1 skrll * magicp = ARMPEMAGIC; 2824 1.1 skrll #else 2825 1.1 skrll * magicp = ARMMAGIC; 2826 1.1 skrll #endif 2827 1.1 skrll * flagsp = 0; 2828 1.1 skrll if (APCS_SET (abfd)) 2829 1.1 skrll { 2830 1.1 skrll if (APCS_26_FLAG (abfd)) 2831 1.1 skrll * flagsp |= F_APCS26; 2832 1.1 skrll 2833 1.1 skrll if (APCS_FLOAT_FLAG (abfd)) 2834 1.1 skrll * flagsp |= F_APCS_FLOAT; 2835 1.1 skrll 2836 1.1 skrll if (PIC_FLAG (abfd)) 2837 1.1 skrll * flagsp |= F_PIC; 2838 1.1 skrll } 2839 1.1 skrll if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd)) 2840 1.1 skrll * flagsp |= F_INTERWORK; 2841 1.1 skrll switch (bfd_get_mach (abfd)) 2842 1.1 skrll { 2843 1.1 skrll case bfd_mach_arm_2: * flagsp |= F_ARM_2; break; 2844 1.1 skrll case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break; 2845 1.1 skrll case bfd_mach_arm_3: * flagsp |= F_ARM_3; break; 2846 1.1 skrll case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break; 2847 1.1 skrll case bfd_mach_arm_4: * flagsp |= F_ARM_4; break; 2848 1.1 skrll case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break; 2849 1.1 skrll case bfd_mach_arm_5: * flagsp |= F_ARM_5; break; 2850 1.1 skrll /* FIXME: we do not have F_ARM vaues greater than F_ARM_5. 2851 1.1 skrll See also the comment in coff_set_arch_mach_hook(). */ 2852 1.1 skrll case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break; 2853 1.1 skrll case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break; 2854 1.1 skrll case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break; 2855 1.9 christos } 2856 1.1 skrll return true; 2857 1.1 skrll #endif 2858 1.1 skrll 2859 1.1 skrll #if defined(I386MAGIC) || defined(AMD64MAGIC) 2860 1.1 skrll case bfd_arch_i386: 2861 1.1 skrll #if defined(I386MAGIC) 2862 1.1 skrll *magicp = I386MAGIC; 2863 1.1 skrll #endif 2864 1.1 skrll #if defined LYNXOS 2865 1.1 skrll /* Just overwrite the usual value if we're doing Lynx. */ 2866 1.1 skrll *magicp = LYNXCOFFMAGIC; 2867 1.1 skrll #endif 2868 1.1 skrll #if defined AMD64MAGIC 2869 1.1 skrll *magicp = AMD64MAGIC; 2870 1.9 christos #endif 2871 1.1 skrll return true; 2872 1.1 skrll #endif 2873 1.1 skrll 2874 1.1 skrll #ifdef IA64MAGIC 2875 1.1 skrll case bfd_arch_ia64: 2876 1.9 christos *magicp = IA64MAGIC; 2877 1.1 skrll return true; 2878 1.1 skrll #endif 2879 1.1 skrll 2880 1.1 skrll #ifdef SH_ARCH_MAGIC_BIG 2881 1.1 skrll case bfd_arch_sh: 2882 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 2883 1.1 skrll *magicp = SH_ARCH_MAGIC_WINCE; 2884 1.1 skrll #else 2885 1.1 skrll if (bfd_big_endian (abfd)) 2886 1.1 skrll *magicp = SH_ARCH_MAGIC_BIG; 2887 1.1 skrll else 2888 1.1 skrll *magicp = SH_ARCH_MAGIC_LITTLE; 2889 1.9 christos #endif 2890 1.1 skrll return true; 2891 1.1 skrll #endif 2892 1.1 skrll 2893 1.1 skrll #ifdef MIPS_ARCH_MAGIC_WINCE 2894 1.1 skrll case bfd_arch_mips: 2895 1.9 christos *magicp = MIPS_ARCH_MAGIC_WINCE; 2896 1.1 skrll return true; 2897 1.1 skrll #endif 2898 1.1 skrll 2899 1.1 skrll #ifdef SPARCMAGIC 2900 1.1 skrll case bfd_arch_sparc: 2901 1.1 skrll *magicp = SPARCMAGIC; 2902 1.1 skrll #ifdef LYNXOS 2903 1.1 skrll /* Just overwrite the usual value if we're doing Lynx. */ 2904 1.1 skrll *magicp = LYNXCOFFMAGIC; 2905 1.9 christos #endif 2906 1.1 skrll return true; 2907 1.1 skrll #endif 2908 1.1 skrll 2909 1.1 skrll #ifdef RS6000COFF_C 2910 1.1 skrll case bfd_arch_rs6000: 2911 1.1 skrll case bfd_arch_powerpc: 2912 1.1 skrll BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour); 2913 1.9 christos *magicp = bfd_xcoff_magic_number (abfd); 2914 1.1 skrll return true; 2915 1.1 skrll #endif 2916 1.1 skrll 2917 1.1 skrll #ifdef MCOREMAGIC 2918 1.1 skrll case bfd_arch_mcore: 2919 1.9 christos * magicp = MCOREMAGIC; 2920 1.1 skrll return true; 2921 1.1 skrll #endif 2922 1.1 skrll 2923 1.1 skrll default: /* Unknown architecture. */ 2924 1.1 skrll break; 2925 1.1 skrll } 2926 1.9 christos 2927 1.1 skrll return false; 2928 1.1 skrll } 2929 1.9 christos 2930 1.1 skrll static bool 2931 1.1 skrll coff_set_arch_mach (bfd * abfd, 2932 1.1 skrll enum bfd_architecture arch, 2933 1.1 skrll unsigned long machine) 2934 1.1 skrll { 2935 1.1 skrll unsigned dummy1; 2936 1.1 skrll unsigned short dummy2; 2937 1.1 skrll 2938 1.9 christos if (! bfd_default_set_arch_mach (abfd, arch, machine)) 2939 1.1 skrll return false; 2940 1.1 skrll 2941 1.1 skrll if (arch != bfd_arch_unknown 2942 1.9 christos && ! coff_set_flags (abfd, &dummy1, &dummy2)) 2943 1.1 skrll return false; /* We can't represent this type. */ 2944 1.9 christos 2945 1.1 skrll return true; /* We're easy... */ 2946 1.1 skrll } 2947 1.1 skrll 2948 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 2949 1.1 skrll 2950 1.1 skrll /* This is used to sort sections by VMA, as required by PE image 2951 1.1 skrll files. */ 2952 1.1 skrll 2953 1.1 skrll static int 2954 1.1 skrll sort_by_secaddr (const void * arg1, const void * arg2) 2955 1.1 skrll { 2956 1.1 skrll const asection *a = *(const asection **) arg1; 2957 1.1 skrll const asection *b = *(const asection **) arg2; 2958 1.1 skrll 2959 1.1 skrll if (a->vma < b->vma) 2960 1.1 skrll return -1; 2961 1.1 skrll else if (a->vma > b->vma) 2962 1.1 skrll return 1; 2963 1.1 skrll 2964 1.1 skrll return 0; 2965 1.1 skrll } 2966 1.1 skrll 2967 1.1 skrll #endif /* COFF_IMAGE_WITH_PE */ 2968 1.1 skrll 2969 1.1 skrll /* Calculate the file position for each section. */ 2970 1.1 skrll 2971 1.8 christos #define ALIGN_SECTIONS_IN_FILE 2972 1.1 skrll #ifdef TICOFF 2973 1.1 skrll #undef ALIGN_SECTIONS_IN_FILE 2974 1.1 skrll #endif 2975 1.9 christos 2976 1.1 skrll static bool 2977 1.1 skrll coff_compute_section_file_positions (bfd * abfd) 2978 1.1 skrll { 2979 1.1 skrll asection *current; 2980 1.9 christos file_ptr sofar = bfd_coff_filhsz (abfd); 2981 1.3 christos bool align_adjust; 2982 1.1 skrll unsigned int target_index; 2983 1.2 matt #ifdef ALIGN_SECTIONS_IN_FILE 2984 1.1 skrll asection *previous = NULL; 2985 1.1 skrll file_ptr old_sofar; 2986 1.1 skrll #endif 2987 1.2 matt 2988 1.9 christos #ifdef COFF_IMAGE_WITH_PE 2989 1.2 matt unsigned int page_size; 2990 1.3 christos 2991 1.3 christos if (coff_data (abfd)->link_info 2992 1.2 matt || (pe_data (abfd) && pe_data (abfd)->pe_opthdr.FileAlignment)) 2993 1.2 matt { 2994 1.2 matt page_size = pe_data (abfd)->pe_opthdr.FileAlignment; 2995 1.2 matt 2996 1.2 matt /* If no file alignment has been set, default to one. 2997 1.2 matt This repairs 'ld -r' for arm-wince-pe target. */ 2998 1.2 matt if (page_size == 0) 2999 1.2 matt page_size = 1; 3000 1.2 matt } 3001 1.2 matt else 3002 1.2 matt page_size = PE_DEF_FILE_ALIGNMENT; 3003 1.2 matt #else 3004 1.9 christos #ifdef COFF_PAGE_SIZE 3005 1.2 matt unsigned int page_size = COFF_PAGE_SIZE; 3006 1.2 matt #endif 3007 1.2 matt #endif 3008 1.1 skrll 3009 1.1 skrll #ifdef RS6000COFF_C 3010 1.1 skrll /* On XCOFF, if we have symbols, set up the .debug section. */ 3011 1.1 skrll if (bfd_get_symcount (abfd) > 0) 3012 1.1 skrll { 3013 1.1 skrll bfd_size_type sz; 3014 1.1 skrll bfd_size_type i, symcount; 3015 1.1 skrll asymbol **symp; 3016 1.1 skrll 3017 1.1 skrll sz = 0; 3018 1.1 skrll symcount = bfd_get_symcount (abfd); 3019 1.1 skrll for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++) 3020 1.1 skrll { 3021 1.1 skrll coff_symbol_type *cf; 3022 1.3 christos 3023 1.1 skrll cf = coff_symbol_from (*symp); 3024 1.1 skrll if (cf != NULL 3025 1.3 christos && cf->native != NULL 3026 1.1 skrll && cf->native->is_sym 3027 1.1 skrll && SYMNAME_IN_DEBUG (&cf->native->u.syment)) 3028 1.1 skrll { 3029 1.1 skrll size_t len; 3030 1.1 skrll 3031 1.1 skrll len = strlen (bfd_asymbol_name (*symp)); 3032 1.1 skrll if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd)) 3033 1.1 skrll sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd); 3034 1.1 skrll } 3035 1.1 skrll } 3036 1.1 skrll if (sz > 0) 3037 1.1 skrll { 3038 1.1 skrll asection *dsec; 3039 1.1 skrll 3040 1.1 skrll dsec = bfd_make_section_old_way (abfd, DOT_DEBUG); 3041 1.1 skrll if (dsec == NULL) 3042 1.1 skrll abort (); 3043 1.1 skrll dsec->size = sz; 3044 1.1 skrll dsec->flags |= SEC_HAS_CONTENTS; 3045 1.1 skrll } 3046 1.1 skrll } 3047 1.1 skrll #endif 3048 1.1 skrll 3049 1.1 skrll if (bfd_get_start_address (abfd)) 3050 1.1 skrll /* A start address may have been added to the original file. In this 3051 1.1 skrll case it will need an optional header to record it. */ 3052 1.1 skrll abfd->flags |= EXEC_P; 3053 1.1 skrll 3054 1.1 skrll if (abfd->flags & EXEC_P) 3055 1.1 skrll sofar += bfd_coff_aoutsz (abfd); 3056 1.1 skrll #ifdef RS6000COFF_C 3057 1.1 skrll else if (xcoff_data (abfd)->full_aouthdr) 3058 1.1 skrll sofar += bfd_coff_aoutsz (abfd); 3059 1.1 skrll else 3060 1.1 skrll sofar += SMALL_AOUTSZ; 3061 1.1 skrll #endif 3062 1.1 skrll 3063 1.1 skrll sofar += abfd->section_count * bfd_coff_scnhsz (abfd); 3064 1.1 skrll 3065 1.1 skrll #ifdef RS6000COFF_C 3066 1.1 skrll /* XCOFF handles overflows in the reloc and line number count fields 3067 1.1 skrll by allocating a new section header to hold the correct counts. */ 3068 1.1 skrll for (current = abfd->sections; current != NULL; current = current->next) 3069 1.1 skrll if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) 3070 1.1 skrll sofar += bfd_coff_scnhsz (abfd); 3071 1.1 skrll #endif 3072 1.10 christos 3073 1.10 christos if (coff_data (abfd)->section_by_target_index) 3074 1.10 christos htab_empty (coff_data (abfd)->section_by_target_index); 3075 1.1 skrll 3076 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3077 1.1 skrll { 3078 1.1 skrll /* PE requires the sections to be in memory order when listed in 3079 1.1 skrll the section headers. It also does not like empty loadable 3080 1.1 skrll sections. The sections apparently do not have to be in the 3081 1.1 skrll right order in the image file itself, but we do need to get the 3082 1.1 skrll target_index values right. */ 3083 1.1 skrll 3084 1.1 skrll unsigned int count; 3085 1.1 skrll asection **section_list; 3086 1.1 skrll unsigned int i; 3087 1.1 skrll bfd_size_type amt; 3088 1.2 matt 3089 1.9 christos #ifdef COFF_PAGE_SIZE 3090 1.9 christos /* Clear D_PAGED if section / file alignment aren't suitable for 3091 1.9 christos paging at COFF_PAGE_SIZE granularity. */ 3092 1.9 christos if (pe_data (abfd)->pe_opthdr.SectionAlignment < COFF_PAGE_SIZE 3093 1.2 matt || page_size < COFF_PAGE_SIZE) 3094 1.2 matt abfd->flags &= ~D_PAGED; 3095 1.2 matt #endif 3096 1.1 skrll 3097 1.1 skrll count = 0; 3098 1.1 skrll for (current = abfd->sections; current != NULL; current = current->next) 3099 1.1 skrll ++count; 3100 1.1 skrll 3101 1.1 skrll /* We allocate an extra cell to simplify the final loop. */ 3102 1.2 matt amt = sizeof (struct asection *) * (count + 1); 3103 1.1 skrll section_list = (asection **) bfd_malloc (amt); 3104 1.9 christos if (section_list == NULL) 3105 1.1 skrll return false; 3106 1.1 skrll 3107 1.1 skrll i = 0; 3108 1.1 skrll for (current = abfd->sections; current != NULL; current = current->next) 3109 1.1 skrll { 3110 1.1 skrll section_list[i] = current; 3111 1.1 skrll ++i; 3112 1.1 skrll } 3113 1.1 skrll section_list[i] = NULL; 3114 1.1 skrll 3115 1.1 skrll qsort (section_list, count, sizeof (asection *), sort_by_secaddr); 3116 1.1 skrll 3117 1.1 skrll /* Rethread the linked list into sorted order; at the same time, 3118 1.1 skrll assign target_index values. */ 3119 1.1 skrll target_index = 1; 3120 1.1 skrll abfd->sections = NULL; 3121 1.1 skrll abfd->section_last = NULL; 3122 1.1 skrll for (i = 0; i < count; i++) 3123 1.1 skrll { 3124 1.1 skrll current = section_list[i]; 3125 1.1 skrll bfd_section_list_append (abfd, current); 3126 1.1 skrll 3127 1.1 skrll /* Later, if the section has zero size, we'll be throwing it 3128 1.1 skrll away, so we don't want to number it now. Note that having 3129 1.1 skrll a zero size and having real contents are different 3130 1.1 skrll concepts: .bss has no contents, but (usually) non-zero 3131 1.1 skrll size. */ 3132 1.1 skrll if (current->size == 0) 3133 1.1 skrll { 3134 1.1 skrll /* Discard. However, it still might have (valid) symbols 3135 1.1 skrll in it, so arbitrarily set it to section 1 (indexing is 3136 1.1 skrll 1-based here; usually .text). __end__ and other 3137 1.1 skrll contents of .endsection really have this happen. 3138 1.1 skrll FIXME: This seems somewhat dubious. */ 3139 1.1 skrll current->target_index = 1; 3140 1.1 skrll } 3141 1.1 skrll else 3142 1.1 skrll current->target_index = target_index++; 3143 1.1 skrll } 3144 1.1 skrll 3145 1.1 skrll free (section_list); 3146 1.1 skrll } 3147 1.1 skrll #else /* ! COFF_IMAGE_WITH_PE */ 3148 1.1 skrll { 3149 1.1 skrll /* Set the target_index field. */ 3150 1.1 skrll target_index = 1; 3151 1.1 skrll for (current = abfd->sections; current != NULL; current = current->next) 3152 1.1 skrll current->target_index = target_index++; 3153 1.1 skrll } 3154 1.1 skrll #endif /* ! COFF_IMAGE_WITH_PE */ 3155 1.3 christos 3156 1.2 matt if (target_index >= bfd_coff_max_nscns (abfd)) 3157 1.2 matt { 3158 1.6 christos bfd_set_error (bfd_error_file_too_big); 3159 1.6 christos _bfd_error_handler 3160 1.7 christos /* xgettext:c-format */ 3161 1.9 christos (_("%pB: too many sections (%d)"), abfd, target_index); 3162 1.2 matt return false; 3163 1.2 matt } 3164 1.9 christos 3165 1.1 skrll align_adjust = false; 3166 1.1 skrll for (current = abfd->sections; 3167 1.1 skrll current != NULL; 3168 1.1 skrll current = current->next) 3169 1.1 skrll { 3170 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3171 1.1 skrll /* With PE we have to pad each section to be a multiple of its 3172 1.1 skrll page size too, and remember both sizes. */ 3173 1.1 skrll if (coff_section_data (abfd, current) == NULL) 3174 1.9 christos { 3175 1.1 skrll size_t amt = sizeof (struct coff_section_tdata); 3176 1.1 skrll 3177 1.1 skrll current->used_by_bfd = bfd_zalloc (abfd, amt); 3178 1.9 christos if (current->used_by_bfd == NULL) 3179 1.1 skrll return false; 3180 1.1 skrll } 3181 1.1 skrll if (pei_section_data (abfd, current) == NULL) 3182 1.9 christos { 3183 1.1 skrll size_t amt = sizeof (struct pei_section_tdata); 3184 1.1 skrll 3185 1.1 skrll coff_section_data (abfd, current)->tdata = bfd_zalloc (abfd, amt); 3186 1.9 christos if (coff_section_data (abfd, current)->tdata == NULL) 3187 1.1 skrll return false; 3188 1.1 skrll } 3189 1.1 skrll if (pei_section_data (abfd, current)->virt_size == 0) 3190 1.1 skrll pei_section_data (abfd, current)->virt_size = current->size; 3191 1.1 skrll #endif 3192 1.1 skrll 3193 1.1 skrll /* Only deal with sections which have contents. */ 3194 1.1 skrll if (!(current->flags & SEC_HAS_CONTENTS)) 3195 1.1 skrll continue; 3196 1.2 matt 3197 1.2 matt current->rawsize = current->size; 3198 1.1 skrll 3199 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3200 1.1 skrll /* Make sure we skip empty sections in a PE image. */ 3201 1.1 skrll if (current->size == 0) 3202 1.1 skrll continue; 3203 1.1 skrll #endif 3204 1.1 skrll 3205 1.7 christos /* Align the sections in the file to the same boundary on 3206 1.1 skrll which they are aligned in virtual memory. */ 3207 1.1 skrll #ifdef ALIGN_SECTIONS_IN_FILE 3208 1.1 skrll if ((abfd->flags & EXEC_P) != 0) 3209 1.1 skrll { 3210 1.1 skrll /* Make sure this section is aligned on the right boundary - by 3211 1.1 skrll padding the previous section up if necessary. */ 3212 1.1 skrll old_sofar = sofar; 3213 1.9 christos 3214 1.9 christos #ifdef COFF_IMAGE_WITH_PE 3215 1.9 christos sofar = BFD_ALIGN (sofar, page_size); 3216 1.10 christos #else 3217 1.9 christos sofar = BFD_ALIGN (sofar, (bfd_vma) 1 << current->alignment_power); 3218 1.3 christos #endif 3219 1.1 skrll 3220 1.3 christos #ifdef RS6000COFF_C 3221 1.3 christos /* Make sure the file offset and the vma of .text/.data are at the 3222 1.3 christos same page offset, so that the file can be mmap'ed without being 3223 1.3 christos relocated. Failing that, AIX is able to load and execute the 3224 1.3 christos program, but it will be silently relocated (possible as 3225 1.3 christos executables are PIE). But the relocation is slightly costly and 3226 1.3 christos complexify the use of addr2line or gdb. So better to avoid it, 3227 1.3 christos like does the native linker. Usually gnu ld makes sure that 3228 1.3 christos the vma of .text is the file offset so this issue shouldn't 3229 1.3 christos appear unless you are stripping such an executable. 3230 1.3 christos 3231 1.3 christos AIX loader checks the text section alignment of (vma - filepos), 3232 1.3 christos and the native linker doesn't try to align the text sections. 3233 1.3 christos For example: 3234 1.6 christos 3235 1.6 christos 0 .text 000054cc 10000128 10000128 00000128 2**5 3236 1.9 christos CONTENTS, ALLOC, LOAD, CODE 3237 1.9 christos 3238 1.9 christos Don't perform the above tweak if the previous one is .tdata, 3239 1.9 christos as it will increase the memory allocated for every threads 3240 1.3 christos created and not just improve performances with gdb. 3241 1.3 christos */ 3242 1.10 christos 3243 1.10 christos if ((current->flags & SEC_LOAD) != 0 3244 1.10 christos && (!strcmp (current->name, _TEXT) 3245 1.9 christos || !strcmp (current->name, _DATA)) 3246 1.1 skrll && (previous == NULL || strcmp(previous->name, _TDATA))) 3247 1.3 christos { 3248 1.3 christos bfd_vma align = 4096; 3249 1.3 christos bfd_vma sofar_off = sofar % align; 3250 1.3 christos bfd_vma vma_off = current->vma % align; 3251 1.3 christos 3252 1.3 christos if (vma_off > sofar_off) 3253 1.3 christos sofar += vma_off - sofar_off; 3254 1.3 christos else if (vma_off < sofar_off) 3255 1.1 skrll sofar += align + vma_off - sofar_off; 3256 1.1 skrll } 3257 1.10 christos #endif 3258 1.10 christos if (previous != NULL 3259 1.1 skrll && (previous->flags & SEC_LOAD) != 0) 3260 1.1 skrll previous->size += sofar - old_sofar; 3261 1.1 skrll } 3262 1.1 skrll 3263 1.1 skrll #endif 3264 1.1 skrll 3265 1.1 skrll /* In demand paged files the low order bits of the file offset 3266 1.1 skrll must match the low order bits of the virtual address. */ 3267 1.1 skrll #ifdef COFF_PAGE_SIZE 3268 1.1 skrll if ((abfd->flags & D_PAGED) != 0 3269 1.1 skrll && (current->flags & SEC_ALLOC) != 0) 3270 1.1 skrll sofar += (current->vma - (bfd_vma) sofar) % page_size; 3271 1.1 skrll #endif 3272 1.1 skrll current->filepos = sofar; 3273 1.1 skrll 3274 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3275 1.2 matt /* Set the padded size. */ 3276 1.1 skrll current->size = (current->size + page_size - 1) & -page_size; 3277 1.1 skrll #endif 3278 1.1 skrll 3279 1.1 skrll sofar += current->size; 3280 1.1 skrll 3281 1.1 skrll #ifdef ALIGN_SECTIONS_IN_FILE 3282 1.1 skrll /* Make sure that this section is of the right size too. */ 3283 1.1 skrll if ((abfd->flags & EXEC_P) == 0) 3284 1.1 skrll { 3285 1.1 skrll bfd_size_type old_size; 3286 1.1 skrll 3287 1.1 skrll old_size = current->size; 3288 1.10 christos current->size = BFD_ALIGN (current->size, 3289 1.1 skrll (bfd_vma) 1 << current->alignment_power); 3290 1.1 skrll align_adjust = current->size != old_size; 3291 1.1 skrll sofar += current->size - old_size; 3292 1.1 skrll } 3293 1.1 skrll else 3294 1.1 skrll { 3295 1.9 christos old_sofar = sofar; 3296 1.9 christos #ifdef COFF_IMAGE_WITH_PE 3297 1.9 christos sofar = BFD_ALIGN (sofar, page_size); 3298 1.10 christos #else 3299 1.9 christos sofar = BFD_ALIGN (sofar, (bfd_vma) 1 << current->alignment_power); 3300 1.1 skrll #endif 3301 1.1 skrll align_adjust = sofar != old_sofar; 3302 1.1 skrll current->size += sofar - old_sofar; 3303 1.1 skrll } 3304 1.1 skrll #endif 3305 1.1 skrll 3306 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3307 1.1 skrll /* For PE we need to make sure we pad out to the aligned 3308 1.1 skrll size, in case the caller only writes out data to the 3309 1.1 skrll unaligned size. */ 3310 1.9 christos if (pei_section_data (abfd, current)->virt_size < current->size) 3311 1.1 skrll align_adjust = true; 3312 1.1 skrll #endif 3313 1.1 skrll 3314 1.1 skrll #ifdef _LIB 3315 1.1 skrll /* Force .lib sections to start at zero. The vma is then 3316 1.1 skrll incremented in coff_set_section_contents. This is right for 3317 1.1 skrll SVR3.2. */ 3318 1.8 christos if (strcmp (current->name, _LIB) == 0) 3319 1.1 skrll bfd_set_section_vma (current, 0); 3320 1.1 skrll #endif 3321 1.2 matt 3322 1.1 skrll #ifdef ALIGN_SECTIONS_IN_FILE 3323 1.2 matt previous = current; 3324 1.1 skrll #endif 3325 1.1 skrll } 3326 1.1 skrll 3327 1.1 skrll /* It is now safe to write to the output file. If we needed an 3328 1.1 skrll alignment adjustment for the last section, then make sure that 3329 1.1 skrll there is a byte at offset sofar. If there are no symbols and no 3330 1.1 skrll relocs, then nothing follows the last section. If we don't force 3331 1.1 skrll the last byte out, then the file may appear to be truncated. */ 3332 1.1 skrll if (align_adjust) 3333 1.1 skrll { 3334 1.1 skrll bfd_byte b; 3335 1.1 skrll 3336 1.1 skrll b = 0; 3337 1.10 christos if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0 3338 1.9 christos || bfd_write (&b, 1, abfd) != 1) 3339 1.1 skrll return false; 3340 1.1 skrll } 3341 1.1 skrll 3342 1.1 skrll /* Make sure the relocations are aligned. We don't need to make 3343 1.1 skrll sure that this byte exists, because it will only matter if there 3344 1.10 christos really are relocs. */ 3345 1.10 christos sofar = BFD_ALIGN (sofar, 3346 1.1 skrll (bfd_vma) 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER); 3347 1.1 skrll 3348 1.9 christos obj_relocbase (abfd) = sofar; 3349 1.1 skrll abfd->output_has_begun = true; 3350 1.9 christos 3351 1.1 skrll return true; 3352 1.1 skrll } 3353 1.1 skrll 3354 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3355 1.9 christos 3356 1.9 christos static bool 3357 1.1 skrll coff_read_word (bfd *abfd, unsigned int *value, unsigned int *pelength) 3358 1.1 skrll { 3359 1.1 skrll unsigned char b[2]; 3360 1.1 skrll int status; 3361 1.10 christos 3362 1.1 skrll status = bfd_read (b, 2, abfd); 3363 1.1 skrll if (status < 1) 3364 1.1 skrll { 3365 1.9 christos *value = 0; 3366 1.1 skrll return false; 3367 1.1 skrll } 3368 1.1 skrll 3369 1.1 skrll if (status == 1) 3370 1.1 skrll *value = (unsigned int) b[0]; 3371 1.1 skrll else 3372 1.1 skrll *value = (unsigned int) (b[0] + (b[1] << 8)); 3373 1.9 christos 3374 1.1 skrll *pelength += status; 3375 1.9 christos 3376 1.1 skrll return true; 3377 1.1 skrll } 3378 1.10 christos 3379 1.10 christos /* Read a two byte number from buffer B returning the result in VALUE. 3380 1.10 christos No more than BUF_SIZE bytes will be read. 3381 1.10 christos Returns true upobn success, false otherwise. 3382 1.10 christos If successful, increases the value stored in PELENGTH by the number 3383 1.10 christos of bytes read. */ 3384 1.10 christos 3385 1.10 christos static bool 3386 1.10 christos coff_read_word_from_buffer (unsigned char * b, 3387 1.10 christos int buf_size, 3388 1.10 christos unsigned int * value, 3389 1.10 christos unsigned int * pelength) 3390 1.10 christos { 3391 1.10 christos if (buf_size < 1) 3392 1.10 christos { 3393 1.10 christos *value = 0; 3394 1.10 christos return false; 3395 1.10 christos } 3396 1.10 christos 3397 1.10 christos if (buf_size == 1) 3398 1.10 christos { 3399 1.10 christos *value = (unsigned int)b[0]; 3400 1.10 christos *pelength += 1; 3401 1.10 christos } 3402 1.10 christos else 3403 1.10 christos { 3404 1.10 christos *value = (unsigned int)(b[0] + (b[1] << 8)); 3405 1.10 christos *pelength += 2; 3406 1.10 christos } 3407 1.10 christos 3408 1.10 christos return true; 3409 1.10 christos } 3410 1.10 christos 3411 1.10 christos #define COFF_CHECKSUM_BUFFER_SIZE 0x800000 3412 1.1 skrll 3413 1.9 christos static unsigned int 3414 1.1 skrll coff_compute_checksum (bfd *abfd, unsigned int *pelength) 3415 1.1 skrll { 3416 1.1 skrll file_ptr filepos; 3417 1.1 skrll unsigned int value; 3418 1.10 christos unsigned int total; 3419 1.10 christos unsigned char *buf; 3420 1.1 skrll int buf_size; 3421 1.1 skrll 3422 1.9 christos total = 0; 3423 1.1 skrll *pelength = 0; 3424 1.10 christos filepos = (file_ptr) 0; 3425 1.10 christos buf = (unsigned char *) bfd_malloc (COFF_CHECKSUM_BUFFER_SIZE); 3426 1.10 christos if (buf == NULL) 3427 1.10 christos return 0; 3428 1.1 skrll buf_size = 0; 3429 1.1 skrll 3430 1.1 skrll do 3431 1.10 christos { 3432 1.10 christos unsigned char *cur_buf; 3433 1.10 christos int cur_buf_size; 3434 1.1 skrll 3435 1.1 skrll if (bfd_seek (abfd, filepos, SEEK_SET) != 0) 3436 1.1 skrll return 0; 3437 1.10 christos 3438 1.10 christos buf_size = bfd_read (buf, COFF_CHECKSUM_BUFFER_SIZE, abfd); 3439 1.10 christos cur_buf_size = buf_size; 3440 1.10 christos cur_buf = buf; 3441 1.10 christos 3442 1.10 christos while (cur_buf_size > 0) 3443 1.10 christos { 3444 1.10 christos coff_read_word_from_buffer (cur_buf, cur_buf_size, &value, pelength); 3445 1.10 christos cur_buf += 2; 3446 1.10 christos cur_buf_size -= 2; 3447 1.10 christos total += value; 3448 1.10 christos total = 0xffff & (total + (total >> 0x10)); 3449 1.10 christos } 3450 1.10 christos 3451 1.1 skrll filepos += buf_size; 3452 1.10 christos } 3453 1.10 christos while (buf_size > 0); 3454 1.10 christos 3455 1.1 skrll free (buf); 3456 1.1 skrll 3457 1.1 skrll return (0xffff & (total + (total >> 0x10))); 3458 1.1 skrll } 3459 1.9 christos 3460 1.1 skrll static bool 3461 1.1 skrll coff_apply_checksum (bfd *abfd) 3462 1.1 skrll { 3463 1.1 skrll unsigned int computed; 3464 1.9 christos unsigned int checksum = 0; 3465 1.9 christos unsigned int peheader; 3466 1.1 skrll unsigned int pelength; 3467 1.1 skrll 3468 1.9 christos if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0) 3469 1.1 skrll return false; 3470 1.9 christos 3471 1.9 christos if (!coff_read_word (abfd, &peheader, &pelength)) 3472 1.1 skrll return false; 3473 1.1 skrll 3474 1.9 christos if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0) 3475 1.1 skrll return false; 3476 1.1 skrll 3477 1.10 christos checksum = 0; 3478 1.10 christos if (bfd_write (&checksum, 4, abfd) != 4) 3479 1.1 skrll return false; 3480 1.1 skrll 3481 1.9 christos if (bfd_seek (abfd, peheader, SEEK_SET) != 0) 3482 1.1 skrll return false; 3483 1.9 christos 3484 1.1 skrll computed = coff_compute_checksum (abfd, &pelength); 3485 1.1 skrll 3486 1.1 skrll checksum = computed + pelength; 3487 1.1 skrll 3488 1.9 christos if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0) 3489 1.1 skrll return false; 3490 1.10 christos 3491 1.1 skrll return bfd_write (&checksum, 4, abfd) == 4; 3492 1.1 skrll } 3493 1.1 skrll 3494 1.1 skrll #endif /* COFF_IMAGE_WITH_PE */ 3495 1.9 christos 3496 1.1 skrll static bool 3497 1.1 skrll coff_write_object_contents (bfd * abfd) 3498 1.1 skrll { 3499 1.9 christos asection *current; 3500 1.9 christos bool hasrelocs = false; 3501 1.2 matt bool haslinno = false; 3502 1.9 christos #ifdef COFF_IMAGE_WITH_PE 3503 1.2 matt bool hasdebug = false; 3504 1.1 skrll #endif 3505 1.1 skrll file_ptr scn_base; 3506 1.1 skrll file_ptr reloc_base; 3507 1.1 skrll file_ptr lineno_base; 3508 1.1 skrll file_ptr sym_base; 3509 1.1 skrll unsigned long reloc_size = 0, reloc_count = 0; 3510 1.9 christos unsigned long lnno_size = 0; 3511 1.1 skrll bool long_section_names; 3512 1.1 skrll asection *text_sec = NULL; 3513 1.1 skrll asection *data_sec = NULL; 3514 1.9 christos asection *bss_sec = NULL; 3515 1.9 christos #ifdef RS6000COFF_C 3516 1.9 christos asection *tdata_sec = NULL; 3517 1.9 christos asection *tbss_sec = NULL; 3518 1.1 skrll #endif 3519 1.1 skrll struct internal_filehdr internal_f; 3520 1.1 skrll struct internal_aouthdr internal_a; 3521 1.1 skrll #ifdef COFF_LONG_SECTION_NAMES 3522 1.1 skrll size_t string_size = STRING_SIZE_SIZE; 3523 1.1 skrll #endif 3524 1.1 skrll 3525 1.1 skrll bfd_set_error (bfd_error_system_call); 3526 1.1 skrll 3527 1.1 skrll /* Make a pass through the symbol table to count line number entries and 3528 1.1 skrll put them into the correct asections. */ 3529 1.1 skrll lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd); 3530 1.1 skrll 3531 1.1 skrll if (! abfd->output_has_begun) 3532 1.1 skrll { 3533 1.9 christos if (! coff_compute_section_file_positions (abfd)) 3534 1.1 skrll return false; 3535 1.1 skrll } 3536 1.1 skrll 3537 1.1 skrll reloc_base = obj_relocbase (abfd); 3538 1.1 skrll 3539 1.1 skrll /* Work out the size of the reloc and linno areas. */ 3540 1.1 skrll 3541 1.1 skrll for (current = abfd->sections; current != NULL; current = 3542 1.1 skrll current->next) 3543 1.9 christos { 3544 1.1 skrll #ifdef COFF_WITH_EXTENDED_RELOC_COUNTER 3545 1.9 christos /* We store the actual reloc count in the first reloc's addr. */ 3546 1.1 skrll if ((obj_pe (abfd) || obj_go32 (abfd)) && current->reloc_count >= 0xffff) 3547 1.1 skrll reloc_count ++; 3548 1.1 skrll #endif 3549 1.1 skrll reloc_count += current->reloc_count; 3550 1.1 skrll } 3551 1.1 skrll 3552 1.1 skrll reloc_size = reloc_count * bfd_coff_relsz (abfd); 3553 1.1 skrll 3554 1.1 skrll lineno_base = reloc_base + reloc_size; 3555 1.1 skrll sym_base = lineno_base + lnno_size; 3556 1.1 skrll 3557 1.1 skrll /* Indicate in each section->line_filepos its actual file address. */ 3558 1.1 skrll for (current = abfd->sections; current != NULL; current = 3559 1.1 skrll current->next) 3560 1.1 skrll { 3561 1.1 skrll if (current->lineno_count) 3562 1.1 skrll { 3563 1.1 skrll current->line_filepos = lineno_base; 3564 1.1 skrll current->moving_line_filepos = lineno_base; 3565 1.1 skrll lineno_base += current->lineno_count * bfd_coff_linesz (abfd); 3566 1.1 skrll } 3567 1.1 skrll else 3568 1.1 skrll current->line_filepos = 0; 3569 1.1 skrll 3570 1.1 skrll if (current->reloc_count) 3571 1.1 skrll { 3572 1.1 skrll current->rel_filepos = reloc_base; 3573 1.9 christos reloc_base += current->reloc_count * bfd_coff_relsz (abfd); 3574 1.1 skrll #ifdef COFF_WITH_EXTENDED_RELOC_COUNTER 3575 1.9 christos /* Extra reloc to hold real count. */ 3576 1.1 skrll if ((obj_pe (abfd) || obj_go32 (abfd)) && current->reloc_count >= 0xffff) 3577 1.1 skrll reloc_base += bfd_coff_relsz (abfd); 3578 1.1 skrll #endif 3579 1.1 skrll } 3580 1.1 skrll else 3581 1.1 skrll current->rel_filepos = 0; 3582 1.1 skrll } 3583 1.1 skrll 3584 1.1 skrll /* Write section headers to the file. */ 3585 1.1 skrll internal_f.f_nscns = 0; 3586 1.1 skrll 3587 1.1 skrll if ((abfd->flags & EXEC_P) != 0) 3588 1.1 skrll scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd); 3589 1.1 skrll else 3590 1.1 skrll { 3591 1.1 skrll scn_base = bfd_coff_filhsz (abfd); 3592 1.1 skrll #ifdef RS6000COFF_C 3593 1.1 skrll #ifndef XCOFF64 3594 1.1 skrll if (xcoff_data (abfd)->full_aouthdr) 3595 1.1 skrll scn_base += bfd_coff_aoutsz (abfd); 3596 1.1 skrll else 3597 1.1 skrll scn_base += SMALL_AOUTSZ; 3598 1.1 skrll #endif 3599 1.1 skrll #endif 3600 1.1 skrll } 3601 1.1 skrll 3602 1.9 christos if (bfd_seek (abfd, scn_base, SEEK_SET) != 0) 3603 1.1 skrll return false; 3604 1.9 christos 3605 1.1 skrll long_section_names = false; 3606 1.1 skrll for (current = abfd->sections; 3607 1.1 skrll current != NULL; 3608 1.1 skrll current = current->next) 3609 1.1 skrll { 3610 1.2 matt struct internal_scnhdr section; 3611 1.9 christos #ifdef COFF_IMAGE_WITH_PE 3612 1.1 skrll bool is_reloc_section = false; 3613 1.2 matt 3614 1.1 skrll if (strcmp (current->name, DOT_RELOC) == 0) 3615 1.9 christos { 3616 1.9 christos is_reloc_section = true; 3617 1.1 skrll hasrelocs = true; 3618 1.1 skrll pe_data (abfd)->has_reloc_section = 1; 3619 1.1 skrll } 3620 1.1 skrll #endif 3621 1.1 skrll 3622 1.1 skrll internal_f.f_nscns++; 3623 1.1 skrll 3624 1.1 skrll strncpy (section.s_name, current->name, SCNNMLEN); 3625 1.1 skrll 3626 1.1 skrll #ifdef COFF_LONG_SECTION_NAMES 3627 1.1 skrll /* Handle long section names as in PE. This must be compatible 3628 1.2 matt with the code in coff_write_symbols and _bfd_coff_final_link. */ 3629 1.2 matt if (bfd_coff_long_section_names (abfd)) 3630 1.2 matt { 3631 1.2 matt size_t len; 3632 1.2 matt 3633 1.2 matt len = strlen (current->name); 3634 1.2 matt if (len > SCNNMLEN) 3635 1.2 matt { 3636 1.2 matt 3637 1.2 matt /* An inherent limitation of the /nnnnnnn notation used to indicate 3638 1.2 matt the offset of the long name in the string table is that we 3639 1.10 christos cannot address entries beyone the ten million byte boundary. */ 3640 1.10 christos if (string_size < 10000000) 3641 1.10 christos { 3642 1.10 christos /* The s_name field is defined to be NUL-padded but need not 3643 1.10 christos be NUL-terminated. We use a temporary buffer so that we 3644 1.10 christos can still sprintf all eight chars without splatting a 3645 1.10 christos terminating NUL over the first byte of the following 3646 1.10 christos member (s_paddr). */ 3647 1.10 christos /* PR 21096: The +20 is to stop a bogus warning from gcc7 3648 1.10 christos about a possible buffer overflow. */ 3649 1.10 christos char s_name_buf[SCNNMLEN + 1 + 20]; 3650 1.10 christos 3651 1.10 christos /* We do not need to use snprintf here as we have already 3652 1.10 christos verified that string_size is not too big, plus we have 3653 1.10 christos an overlarge buffer, just in case. */ 3654 1.10 christos sprintf (s_name_buf, "/%lu", (unsigned long) string_size); 3655 1.10 christos /* Then strncpy takes care of any padding for us. */ 3656 1.10 christos strncpy (section.s_name, s_name_buf, SCNNMLEN); 3657 1.10 christos } 3658 1.10 christos else 3659 1.10 christos #ifdef COFF_WITH_PE 3660 1.10 christos { 3661 1.10 christos /* PE use a base 64 encoding for long section names whose 3662 1.10 christos index is very large. But contrary to RFC 4648, there is 3663 1.10 christos no padding: 6 characters must be generated. */ 3664 1.10 christos static const char base64[] = 3665 1.10 christos "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 3666 1.10 christos "abcdefghijklmnopqrstuvwxyz" 3667 1.10 christos "0123456789+/"; 3668 1.10 christos unsigned long off = string_size; 3669 1.10 christos unsigned i; 3670 1.10 christos 3671 1.10 christos section.s_name[0] = '/'; 3672 1.10 christos section.s_name[1] = '/'; 3673 1.10 christos for (i = SCNNMLEN - 1; i >= 2; i--) 3674 1.10 christos { 3675 1.10 christos section.s_name[i] = base64[off & 0x3f]; 3676 1.10 christos off >>= 6; 3677 1.10 christos } 3678 1.10 christos } 3679 1.10 christos #endif 3680 1.10 christos if (string_size > 0xffffffffUL - (len + 1) 3681 1.10 christos #ifndef COFF_WITH_PE 3682 1.10 christos || string_size >= 10000000 3683 1.10 christos #endif 3684 1.2 matt ) 3685 1.2 matt { 3686 1.6 christos bfd_set_error (bfd_error_file_too_big); 3687 1.6 christos _bfd_error_handler 3688 1.7 christos /* xgettext:c-format */ 3689 1.6 christos (_("%pB: section %pA: string table overflow at offset %ld"), 3690 1.9 christos abfd, current, (unsigned long) string_size); 3691 1.2 matt return false; 3692 1.1 skrll } 3693 1.2 matt 3694 1.9 christos string_size += len + 1; 3695 1.2 matt long_section_names = true; 3696 1.2 matt } 3697 1.1 skrll } 3698 1.1 skrll #endif 3699 1.1 skrll 3700 1.1 skrll #ifdef _LIB 3701 1.1 skrll /* Always set s_vaddr of .lib to 0. This is right for SVR3.2 3702 1.1 skrll Ian Taylor <ian (at) cygnus.com>. */ 3703 1.1 skrll if (strcmp (current->name, _LIB) == 0) 3704 1.1 skrll section.s_vaddr = 0; 3705 1.1 skrll else 3706 1.1 skrll #endif 3707 1.1 skrll section.s_vaddr = current->vma; 3708 1.1 skrll section.s_paddr = current->lma; 3709 1.1 skrll section.s_size = current->size; 3710 1.1 skrll #ifdef coff_get_section_load_page 3711 1.2 matt section.s_page = coff_get_section_load_page (current); 3712 1.2 matt #else 3713 1.1 skrll section.s_page = 0; 3714 1.1 skrll #endif 3715 1.1 skrll 3716 1.1 skrll #ifdef COFF_WITH_PE 3717 1.1 skrll section.s_paddr = 0; 3718 1.1 skrll #endif 3719 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3720 1.1 skrll /* Reminder: s_paddr holds the virtual size of the section. */ 3721 1.1 skrll if (coff_section_data (abfd, current) != NULL 3722 1.1 skrll && pei_section_data (abfd, current) != NULL) 3723 1.1 skrll section.s_paddr = pei_section_data (abfd, current)->virt_size; 3724 1.1 skrll else 3725 1.1 skrll section.s_paddr = 0; 3726 1.1 skrll #endif 3727 1.1 skrll 3728 1.1 skrll /* If this section has no size or is unloadable then the scnptr 3729 1.1 skrll will be 0 too. */ 3730 1.1 skrll if (current->size == 0 3731 1.1 skrll || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) 3732 1.1 skrll section.s_scnptr = 0; 3733 1.1 skrll else 3734 1.1 skrll section.s_scnptr = current->filepos; 3735 1.1 skrll 3736 1.1 skrll section.s_relptr = current->rel_filepos; 3737 1.1 skrll section.s_lnnoptr = current->line_filepos; 3738 1.1 skrll section.s_nreloc = current->reloc_count; 3739 1.1 skrll section.s_nlnno = current->lineno_count; 3740 1.1 skrll #ifndef COFF_IMAGE_WITH_PE 3741 1.1 skrll /* In PEI, relocs come in the .reloc section. */ 3742 1.9 christos if (current->reloc_count != 0) 3743 1.1 skrll hasrelocs = true; 3744 1.1 skrll #endif 3745 1.9 christos if (current->lineno_count != 0) 3746 1.2 matt haslinno = true; 3747 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3748 1.1 skrll if ((current->flags & SEC_DEBUGGING) != 0 3749 1.9 christos && ! is_reloc_section) 3750 1.2 matt hasdebug = true; 3751 1.1 skrll #endif 3752 1.1 skrll 3753 1.1 skrll #ifdef RS6000COFF_C 3754 1.1 skrll #ifndef XCOFF64 3755 1.1 skrll /* Indicate the use of an XCOFF overflow section header. */ 3756 1.1 skrll if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) 3757 1.1 skrll { 3758 1.1 skrll section.s_nreloc = 0xffff; 3759 1.1 skrll section.s_nlnno = 0xffff; 3760 1.1 skrll } 3761 1.1 skrll #endif 3762 1.1 skrll #endif 3763 1.1 skrll 3764 1.1 skrll section.s_flags = sec_to_styp_flags (current->name, current->flags); 3765 1.1 skrll 3766 1.1 skrll if (!strcmp (current->name, _TEXT)) 3767 1.1 skrll text_sec = current; 3768 1.1 skrll else if (!strcmp (current->name, _DATA)) 3769 1.1 skrll data_sec = current; 3770 1.1 skrll else if (!strcmp (current->name, _BSS)) 3771 1.9 christos bss_sec = current; 3772 1.9 christos #ifdef RS6000COFF_C 3773 1.9 christos else if (!strcmp (current->name, _TDATA)) 3774 1.9 christos tdata_sec = current; 3775 1.9 christos else if (!strcmp (current->name, _TBSS)) 3776 1.9 christos tbss_sec = current; 3777 1.9 christos #endif 3778 1.1 skrll 3779 1.1 skrll 3780 1.9 christos #ifdef COFF_ENCODE_ALIGNMENT 3781 1.9 christos if (COFF_ENCODE_ALIGNMENT (abfd, section, current->alignment_power) 3782 1.9 christos && (COFF_DECODE_ALIGNMENT (section.s_flags) 3783 1.6 christos != current->alignment_power)) 3784 1.9 christos { 3785 1.9 christos bool warn = (coff_data (abfd)->link_info 3786 1.6 christos && !bfd_link_relocatable (coff_data (abfd)->link_info)); 3787 1.6 christos 3788 1.6 christos _bfd_error_handler 3789 1.7 christos /* xgettext:c-format */ 3790 1.9 christos (_("%pB:%s section %s: alignment 2**%u not representable"), 3791 1.9 christos abfd, warn ? " warning:" : "", current->name, 3792 1.6 christos current->alignment_power); 3793 1.6 christos if (!warn) 3794 1.6 christos { 3795 1.9 christos bfd_set_error (bfd_error_nonrepresentable_section); 3796 1.6 christos return false; 3797 1.6 christos } 3798 1.1 skrll } 3799 1.1 skrll #endif 3800 1.1 skrll 3801 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 3802 1.1 skrll /* Suppress output of the sections if they are null. ld 3803 1.1 skrll includes the bss and data sections even if there is no size 3804 1.1 skrll assigned to them. NT loader doesn't like it if these section 3805 1.1 skrll headers are included if the sections themselves are not 3806 1.1 skrll needed. See also coff_compute_section_file_positions. */ 3807 1.1 skrll if (section.s_size == 0) 3808 1.1 skrll internal_f.f_nscns--; 3809 1.1 skrll else 3810 1.1 skrll #endif 3811 1.1 skrll { 3812 1.1 skrll SCNHDR buff; 3813 1.1 skrll bfd_size_type amt = bfd_coff_scnhsz (abfd); 3814 1.12 christos 3815 1.10 christos if (bfd_coff_swap_scnhdr_out (abfd, §ion, &buff, current) == 0 3816 1.9 christos || bfd_write (& buff, amt, abfd) != amt) 3817 1.1 skrll return false; 3818 1.1 skrll } 3819 1.1 skrll 3820 1.1 skrll #ifdef COFF_WITH_PE 3821 1.1 skrll /* PE stores COMDAT section information in the symbol table. If 3822 1.1 skrll this section is supposed to have some COMDAT info, track down 3823 1.1 skrll the symbol in the symbol table and modify it. */ 3824 1.1 skrll if ((current->flags & SEC_LINK_ONCE) != 0) 3825 1.1 skrll { 3826 1.1 skrll unsigned int i, count; 3827 1.1 skrll asymbol **psym; 3828 1.1 skrll coff_symbol_type *csym = NULL; 3829 1.1 skrll asymbol **psymsec; 3830 1.1 skrll 3831 1.1 skrll psymsec = NULL; 3832 1.1 skrll count = bfd_get_symcount (abfd); 3833 1.1 skrll for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++) 3834 1.1 skrll { 3835 1.1 skrll if ((*psym)->section != current) 3836 1.1 skrll continue; 3837 1.1 skrll 3838 1.1 skrll /* Remember the location of the first symbol in this 3839 1.1 skrll section. */ 3840 1.1 skrll if (psymsec == NULL) 3841 1.1 skrll psymsec = psym; 3842 1.1 skrll 3843 1.1 skrll /* See if this is the section symbol. */ 3844 1.1 skrll if (strcmp ((*psym)->name, current->name) == 0) 3845 1.3 christos { 3846 1.1 skrll csym = coff_symbol_from (*psym); 3847 1.1 skrll if (csym == NULL 3848 1.3 christos || csym->native == NULL 3849 1.1 skrll || ! csym->native->is_sym 3850 1.1 skrll || csym->native->u.syment.n_numaux < 1 3851 1.1 skrll || csym->native->u.syment.n_sclass != C_STAT 3852 1.1 skrll || csym->native->u.syment.n_type != T_NULL) 3853 1.1 skrll continue; 3854 1.1 skrll 3855 1.1 skrll /* Here *PSYM is the section symbol for CURRENT. */ 3856 1.1 skrll 3857 1.1 skrll break; 3858 1.1 skrll } 3859 1.1 skrll } 3860 1.1 skrll 3861 1.1 skrll /* Did we find it? 3862 1.1 skrll Note that we might not if we're converting the file from 3863 1.1 skrll some other object file format. */ 3864 1.1 skrll if (i < count) 3865 1.1 skrll { 3866 1.1 skrll combined_entry_type *aux; 3867 1.1 skrll 3868 1.1 skrll /* We don't touch the x_checksum field. The 3869 1.1 skrll x_associated field is not currently supported. */ 3870 1.1 skrll 3871 1.3 christos aux = csym->native + 1; 3872 1.1 skrll BFD_ASSERT (! aux->is_sym); 3873 1.1 skrll switch (current->flags & SEC_LINK_DUPLICATES) 3874 1.1 skrll { 3875 1.1 skrll case SEC_LINK_DUPLICATES_DISCARD: 3876 1.1 skrll aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY; 3877 1.1 skrll break; 3878 1.1 skrll 3879 1.1 skrll case SEC_LINK_DUPLICATES_ONE_ONLY: 3880 1.1 skrll aux->u.auxent.x_scn.x_comdat = 3881 1.1 skrll IMAGE_COMDAT_SELECT_NODUPLICATES; 3882 1.1 skrll break; 3883 1.1 skrll 3884 1.1 skrll case SEC_LINK_DUPLICATES_SAME_SIZE: 3885 1.1 skrll aux->u.auxent.x_scn.x_comdat = 3886 1.1 skrll IMAGE_COMDAT_SELECT_SAME_SIZE; 3887 1.1 skrll break; 3888 1.1 skrll 3889 1.1 skrll case SEC_LINK_DUPLICATES_SAME_CONTENTS: 3890 1.1 skrll aux->u.auxent.x_scn.x_comdat = 3891 1.1 skrll IMAGE_COMDAT_SELECT_EXACT_MATCH; 3892 1.1 skrll break; 3893 1.1 skrll } 3894 1.1 skrll 3895 1.1 skrll /* The COMDAT symbol must be the first symbol from this 3896 1.1 skrll section in the symbol table. In order to make this 3897 1.1 skrll work, we move the COMDAT symbol before the first 3898 1.1 skrll symbol we found in the search above. It's OK to 3899 1.1 skrll rearrange the symbol table at this point, because 3900 1.1 skrll coff_renumber_symbols is going to rearrange it 3901 1.1 skrll further and fix up all the aux entries. */ 3902 1.1 skrll if (psym != psymsec) 3903 1.1 skrll { 3904 1.1 skrll asymbol *hold; 3905 1.1 skrll asymbol **pcopy; 3906 1.1 skrll 3907 1.1 skrll hold = *psym; 3908 1.1 skrll for (pcopy = psym; pcopy > psymsec; pcopy--) 3909 1.1 skrll pcopy[0] = pcopy[-1]; 3910 1.1 skrll *psymsec = hold; 3911 1.1 skrll } 3912 1.1 skrll } 3913 1.1 skrll } 3914 1.1 skrll #endif /* COFF_WITH_PE */ 3915 1.1 skrll } 3916 1.1 skrll 3917 1.1 skrll #ifdef RS6000COFF_C 3918 1.1 skrll #ifndef XCOFF64 3919 1.1 skrll /* XCOFF handles overflows in the reloc and line number count fields 3920 1.1 skrll by creating a new section header to hold the correct values. */ 3921 1.1 skrll for (current = abfd->sections; current != NULL; current = current->next) 3922 1.1 skrll { 3923 1.1 skrll if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) 3924 1.1 skrll { 3925 1.1 skrll struct internal_scnhdr scnhdr; 3926 1.1 skrll SCNHDR buff; 3927 1.1 skrll bfd_size_type amt; 3928 1.1 skrll 3929 1.3 christos internal_f.f_nscns++; 3930 1.1 skrll memcpy (scnhdr.s_name, ".ovrflo", 8); 3931 1.1 skrll scnhdr.s_paddr = current->reloc_count; 3932 1.1 skrll scnhdr.s_vaddr = current->lineno_count; 3933 1.1 skrll scnhdr.s_size = 0; 3934 1.1 skrll scnhdr.s_scnptr = 0; 3935 1.1 skrll scnhdr.s_relptr = current->rel_filepos; 3936 1.1 skrll scnhdr.s_lnnoptr = current->line_filepos; 3937 1.1 skrll scnhdr.s_nreloc = current->target_index; 3938 1.1 skrll scnhdr.s_nlnno = current->target_index; 3939 1.1 skrll scnhdr.s_flags = STYP_OVRFLO; 3940 1.12 christos amt = bfd_coff_scnhsz (abfd); 3941 1.10 christos if (bfd_coff_swap_scnhdr_out (abfd, &scnhdr, &buff, current) == 0 3942 1.9 christos || bfd_write (& buff, amt, abfd) != amt) 3943 1.1 skrll return false; 3944 1.1 skrll } 3945 1.1 skrll } 3946 1.1 skrll #endif 3947 1.1 skrll #endif 3948 1.9 christos 3949 1.9 christos #if defined (COFF_GO32_EXE) || defined (COFF_GO32) 3950 1.10 christos /* Pad section headers. */ 3951 1.9 christos if ((abfd->flags & EXEC_P) != 0) 3952 1.10 christos { 3953 1.10 christos asection *s = abfd->sections; 3954 1.10 christos while (s != NULL && s->filepos == 0) 3955 1.10 christos s = s->next; 3956 1.10 christos if (s != NULL) 3957 1.10 christos { 3958 1.10 christos file_ptr cur_ptr 3959 1.10 christos = scn_base + abfd->section_count * bfd_coff_scnhsz (abfd); 3960 1.10 christos file_ptr fill_size = s->filepos - cur_ptr; 3961 1.10 christos if (fill_size > 0) 3962 1.10 christos { 3963 1.10 christos bfd_byte *b = bfd_zmalloc (fill_size); 3964 1.10 christos if (!b) 3965 1.10 christos return false; 3966 1.10 christos if (bfd_write (b, fill_size, abfd) != (ufile_ptr) fill_size) 3967 1.10 christos { 3968 1.10 christos free (b); 3969 1.10 christos return false; 3970 1.10 christos } 3971 1.10 christos free (b); 3972 1.9 christos } 3973 1.9 christos } 3974 1.9 christos } 3975 1.9 christos #endif 3976 1.1 skrll 3977 1.1 skrll /* OK, now set up the filehdr... */ 3978 1.1 skrll 3979 1.1 skrll /* Don't include the internal abs section in the section count */ 3980 1.1 skrll 3981 1.1 skrll /* We will NOT put a fucking timestamp in the header here. Every time you 3982 1.1 skrll put it back, I will come in and take it out again. I'm sorry. This 3983 1.1 skrll field does not belong here. We fill it with a 0 so it compares the 3984 1.1 skrll same but is not a reasonable time. -- gnu (at) cygnus.com */ 3985 1.1 skrll internal_f.f_timdat = 0; 3986 1.1 skrll internal_f.f_flags = 0; 3987 1.1 skrll 3988 1.1 skrll if (abfd->flags & EXEC_P) 3989 1.1 skrll internal_f.f_opthdr = bfd_coff_aoutsz (abfd); 3990 1.1 skrll else 3991 1.1 skrll { 3992 1.1 skrll internal_f.f_opthdr = 0; 3993 1.1 skrll #ifdef RS6000COFF_C 3994 1.1 skrll #ifndef XCOFF64 3995 1.1 skrll if (xcoff_data (abfd)->full_aouthdr) 3996 1.1 skrll internal_f.f_opthdr = bfd_coff_aoutsz (abfd); 3997 1.1 skrll else 3998 1.1 skrll internal_f.f_opthdr = SMALL_AOUTSZ; 3999 1.1 skrll #endif 4000 1.1 skrll #endif 4001 1.1 skrll } 4002 1.1 skrll 4003 1.1 skrll if (!hasrelocs) 4004 1.1 skrll internal_f.f_flags |= F_RELFLG; 4005 1.1 skrll if (!haslinno) 4006 1.1 skrll internal_f.f_flags |= F_LNNO; 4007 1.1 skrll if (abfd->flags & EXEC_P) 4008 1.1 skrll internal_f.f_flags |= F_EXEC; 4009 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 4010 1.1 skrll if (! hasdebug) 4011 1.1 skrll internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED; 4012 1.1 skrll if (pe_data (abfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE) 4013 1.1 skrll internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE; 4014 1.1 skrll #endif 4015 1.10 christos 4016 1.1 skrll #if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64) 4017 1.1 skrll #ifdef COFF_WITH_PE 4018 1.1 skrll internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE; 4019 1.1 skrll #else 4020 1.1 skrll if (bfd_little_endian (abfd)) 4021 1.1 skrll internal_f.f_flags |= F_AR32WR; 4022 1.1 skrll else 4023 1.1 skrll internal_f.f_flags |= F_AR32W; 4024 1.1 skrll #endif 4025 1.1 skrll #endif 4026 1.1 skrll 4027 1.1 skrll #ifdef TI_TARGET_ID 4028 1.1 skrll /* Target id is used in TI COFF v1 and later; COFF0 won't use this field, 4029 1.1 skrll but it doesn't hurt to set it internally. */ 4030 1.1 skrll internal_f.f_target_id = TI_TARGET_ID; 4031 1.1 skrll #endif 4032 1.1 skrll 4033 1.1 skrll /* FIXME, should do something about the other byte orders and 4034 1.1 skrll architectures. */ 4035 1.1 skrll 4036 1.1 skrll #ifdef RS6000COFF_C 4037 1.1 skrll if ((abfd->flags & DYNAMIC) != 0) 4038 1.1 skrll internal_f.f_flags |= F_SHROBJ; 4039 1.1 skrll if (bfd_get_section_by_name (abfd, _LOADER) != NULL) 4040 1.1 skrll internal_f.f_flags |= F_DYNLOAD; 4041 1.1 skrll #endif 4042 1.4 christos 4043 1.4 christos memset (&internal_a, 0, sizeof internal_a); 4044 1.1 skrll 4045 1.1 skrll /* Set up architecture-dependent stuff. */ 4046 1.1 skrll { 4047 1.1 skrll unsigned int magic = 0; 4048 1.1 skrll unsigned short flags = 0; 4049 1.1 skrll 4050 1.1 skrll coff_set_flags (abfd, &magic, &flags); 4051 1.1 skrll internal_f.f_magic = magic; 4052 1.1 skrll internal_f.f_flags |= flags; 4053 1.1 skrll /* ...and the "opt"hdr... */ 4054 1.1 skrll 4055 1.1 skrll #ifdef TICOFF_AOUT_MAGIC 4056 1.1 skrll internal_a.magic = TICOFF_AOUT_MAGIC; 4057 1.1 skrll #define __A_MAGIC_SET__ 4058 1.1 skrll #endif 4059 1.1 skrll 4060 1.1 skrll #if defined(ARM) 4061 1.1 skrll #define __A_MAGIC_SET__ 4062 1.1 skrll internal_a.magic = ZMAGIC; 4063 1.1 skrll #endif 4064 1.9 christos 4065 1.1 skrll #if defined(AARCH64) 4066 1.9 christos #define __A_MAGIC_SET__ 4067 1.1 skrll internal_a.magic = ZMAGIC; 4068 1.1 skrll #endif 4069 1.10 christos 4070 1.10 christos #if defined(LOONGARCH64) 4071 1.10 christos #define __A_MAGIC_SET__ 4072 1.10 christos internal_a.magic = ZMAGIC; 4073 1.10 christos #endif 4074 1.10 christos 4075 1.10 christos #if defined(RISCV64) 4076 1.10 christos #define __A_MAGIC_SET__ 4077 1.10 christos internal_a.magic = ZMAGIC; 4078 1.10 christos #endif 4079 1.1 skrll 4080 1.1 skrll #if defined MCORE_PE 4081 1.1 skrll #define __A_MAGIC_SET__ 4082 1.1 skrll internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC; 4083 1.1 skrll #endif 4084 1.1 skrll 4085 1.1 skrll #if defined(I386) 4086 1.1 skrll #define __A_MAGIC_SET__ 4087 1.1 skrll #if defined LYNXOS 4088 1.1 skrll internal_a.magic = LYNXCOFFMAGIC; 4089 1.1 skrll #elif defined AMD64 4090 1.1 skrll internal_a.magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC; 4091 1.1 skrll #else 4092 1.1 skrll internal_a.magic = ZMAGIC; 4093 1.1 skrll #endif 4094 1.1 skrll #endif /* I386 */ 4095 1.1 skrll 4096 1.1 skrll #if defined(IA64) 4097 1.1 skrll #define __A_MAGIC_SET__ 4098 1.1 skrll internal_a.magic = PE32PMAGIC; 4099 1.1 skrll #endif /* IA64 */ 4100 1.1 skrll 4101 1.1 skrll #if defined(SPARC) 4102 1.1 skrll #define __A_MAGIC_SET__ 4103 1.1 skrll #if defined(LYNXOS) 4104 1.1 skrll internal_a.magic = LYNXCOFFMAGIC; 4105 1.1 skrll #endif /* LYNXOS */ 4106 1.1 skrll #endif /* SPARC */ 4107 1.1 skrll 4108 1.1 skrll #ifdef RS6000COFF_C 4109 1.1 skrll #define __A_MAGIC_SET__ 4110 1.1 skrll internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC : 4111 1.1 skrll (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC : 4112 1.1 skrll RS6K_AOUTHDR_OMAGIC; 4113 1.1 skrll #endif 4114 1.1 skrll 4115 1.1 skrll #if defined(SH) && defined(COFF_WITH_PE) 4116 1.1 skrll #define __A_MAGIC_SET__ 4117 1.1 skrll internal_a.magic = SH_PE_MAGIC; 4118 1.1 skrll #endif 4119 1.1 skrll 4120 1.1 skrll #if defined(MIPS) && defined(COFF_WITH_PE) 4121 1.1 skrll #define __A_MAGIC_SET__ 4122 1.1 skrll internal_a.magic = MIPS_PE_MAGIC; 4123 1.1 skrll #endif 4124 1.1 skrll 4125 1.1 skrll #ifndef __A_MAGIC_SET__ 4126 1.1 skrll #include "Your aouthdr magic number is not being set!" 4127 1.1 skrll #else 4128 1.1 skrll #undef __A_MAGIC_SET__ 4129 1.1 skrll #endif 4130 1.1 skrll } 4131 1.9 christos 4132 1.9 christos #ifdef RS6000COFF_C 4133 1.9 christos /* XCOFF 32bit needs this to have new behaviour for n_type field. */ 4134 1.9 christos internal_a.vstamp = 2; 4135 1.1 skrll #else 4136 1.1 skrll /* FIXME: Does anybody ever set this to another value? */ 4137 1.9 christos internal_a.vstamp = 0; 4138 1.1 skrll #endif 4139 1.1 skrll 4140 1.1 skrll /* Now should write relocs, strings, syms. */ 4141 1.1 skrll obj_sym_filepos (abfd) = sym_base; 4142 1.1 skrll 4143 1.1 skrll if (bfd_get_symcount (abfd) != 0) 4144 1.1 skrll { 4145 1.1 skrll int firstundef; 4146 1.1 skrll 4147 1.9 christos if (!coff_renumber_symbols (abfd, &firstundef)) 4148 1.1 skrll return false; 4149 1.1 skrll coff_mangle_symbols (abfd); 4150 1.9 christos if (! coff_write_symbols (abfd)) 4151 1.1 skrll return false; 4152 1.9 christos if (! coff_write_linenumbers (abfd)) 4153 1.1 skrll return false; 4154 1.9 christos if (! coff_write_relocs (abfd, firstundef)) 4155 1.1 skrll return false; 4156 1.1 skrll } 4157 1.1 skrll #ifdef COFF_LONG_SECTION_NAMES 4158 1.1 skrll else if (long_section_names && ! obj_coff_strings_written (abfd)) 4159 1.1 skrll { 4160 1.1 skrll /* If we have long section names we have to write out the string 4161 1.1 skrll table even if there are no symbols. */ 4162 1.9 christos if (! coff_write_symbols (abfd)) 4163 1.1 skrll return false; 4164 1.1 skrll } 4165 1.1 skrll #endif 4166 1.1 skrll /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF 4167 1.1 skrll backend linker, and obj_raw_syment_count is not valid until after 4168 1.1 skrll coff_write_symbols is called. */ 4169 1.1 skrll if (obj_raw_syment_count (abfd) != 0) 4170 1.1 skrll { 4171 1.1 skrll internal_f.f_symptr = sym_base; 4172 1.1 skrll #ifdef RS6000COFF_C 4173 1.1 skrll /* AIX appears to require that F_RELFLG not be set if there are 4174 1.1 skrll local symbols but no relocations. */ 4175 1.1 skrll internal_f.f_flags &=~ F_RELFLG; 4176 1.1 skrll #endif 4177 1.1 skrll } 4178 1.1 skrll else 4179 1.1 skrll { 4180 1.1 skrll if (long_section_names) 4181 1.1 skrll internal_f.f_symptr = sym_base; 4182 1.1 skrll else 4183 1.1 skrll internal_f.f_symptr = 0; 4184 1.1 skrll internal_f.f_flags |= F_LSYMS; 4185 1.1 skrll } 4186 1.1 skrll 4187 1.1 skrll if (text_sec) 4188 1.1 skrll { 4189 1.1 skrll internal_a.tsize = text_sec->size; 4190 1.1 skrll internal_a.text_start = internal_a.tsize ? text_sec->vma : 0; 4191 1.1 skrll } 4192 1.1 skrll if (data_sec) 4193 1.1 skrll { 4194 1.1 skrll internal_a.dsize = data_sec->size; 4195 1.1 skrll internal_a.data_start = internal_a.dsize ? data_sec->vma : 0; 4196 1.1 skrll } 4197 1.1 skrll if (bss_sec) 4198 1.1 skrll { 4199 1.1 skrll internal_a.bsize = bss_sec->size; 4200 1.1 skrll if (internal_a.bsize && bss_sec->vma < internal_a.data_start) 4201 1.1 skrll internal_a.data_start = bss_sec->vma; 4202 1.1 skrll } 4203 1.1 skrll 4204 1.1 skrll internal_a.entry = bfd_get_start_address (abfd); 4205 1.1 skrll internal_f.f_nsyms = obj_raw_syment_count (abfd); 4206 1.1 skrll 4207 1.1 skrll #ifdef RS6000COFF_C 4208 1.1 skrll if (xcoff_data (abfd)->full_aouthdr) 4209 1.1 skrll { 4210 1.1 skrll bfd_vma toc; 4211 1.1 skrll asection *loader_sec; 4212 1.9 christos 4213 1.1 skrll internal_a.vstamp = 2; 4214 1.1 skrll 4215 1.1 skrll internal_a.o_snentry = xcoff_data (abfd)->snentry; 4216 1.1 skrll if (internal_a.o_snentry == 0) 4217 1.1 skrll internal_a.entry = (bfd_vma) -1; 4218 1.1 skrll 4219 1.1 skrll if (text_sec != NULL) 4220 1.1 skrll { 4221 1.8 christos internal_a.o_sntext = text_sec->target_index; 4222 1.1 skrll internal_a.o_algntext = bfd_section_alignment (text_sec); 4223 1.1 skrll } 4224 1.1 skrll else 4225 1.1 skrll { 4226 1.1 skrll internal_a.o_sntext = 0; 4227 1.1 skrll internal_a.o_algntext = 0; 4228 1.1 skrll } 4229 1.1 skrll if (data_sec != NULL) 4230 1.1 skrll { 4231 1.8 christos internal_a.o_sndata = data_sec->target_index; 4232 1.1 skrll internal_a.o_algndata = bfd_section_alignment (data_sec); 4233 1.1 skrll } 4234 1.1 skrll else 4235 1.1 skrll { 4236 1.1 skrll internal_a.o_sndata = 0; 4237 1.1 skrll internal_a.o_algndata = 0; 4238 1.1 skrll } 4239 1.1 skrll loader_sec = bfd_get_section_by_name (abfd, ".loader"); 4240 1.1 skrll if (loader_sec != NULL) 4241 1.1 skrll internal_a.o_snloader = loader_sec->target_index; 4242 1.1 skrll else 4243 1.1 skrll internal_a.o_snloader = 0; 4244 1.1 skrll if (bss_sec != NULL) 4245 1.1 skrll internal_a.o_snbss = bss_sec->target_index; 4246 1.1 skrll else 4247 1.1 skrll internal_a.o_snbss = 0; 4248 1.9 christos 4249 1.9 christos if (tdata_sec != NULL) 4250 1.9 christos { 4251 1.9 christos internal_a.o_sntdata = tdata_sec->target_index; 4252 1.9 christos /* TODO: o_flags should be set to RS6K_AOUTHDR_TLS_LE 4253 1.9 christos if there is at least one R_TLS_LE relocations. */ 4254 1.9 christos internal_a.o_flags = 0; 4255 1.9 christos #ifdef XCOFF64 4256 1.9 christos internal_a.o_x64flags = 0; 4257 1.9 christos #endif 4258 1.9 christos } 4259 1.9 christos else 4260 1.9 christos { 4261 1.9 christos internal_a.o_sntdata = 0; 4262 1.9 christos internal_a.o_flags = 0; 4263 1.9 christos #ifdef XCOFF64 4264 1.9 christos internal_a.o_x64flags = 0; 4265 1.9 christos #endif 4266 1.9 christos } 4267 1.9 christos if (tbss_sec != NULL) 4268 1.9 christos internal_a.o_sntbss = tbss_sec->target_index; 4269 1.9 christos else 4270 1.9 christos internal_a.o_sntbss = 0; 4271 1.1 skrll 4272 1.1 skrll toc = xcoff_data (abfd)->toc; 4273 1.1 skrll internal_a.o_toc = toc; 4274 1.1 skrll internal_a.o_sntoc = xcoff_data (abfd)->sntoc; 4275 1.1 skrll 4276 1.1 skrll internal_a.o_modtype = xcoff_data (abfd)->modtype; 4277 1.1 skrll if (xcoff_data (abfd)->cputype != -1) 4278 1.1 skrll internal_a.o_cputype = xcoff_data (abfd)->cputype; 4279 1.1 skrll else 4280 1.1 skrll { 4281 1.1 skrll switch (bfd_get_arch (abfd)) 4282 1.1 skrll { 4283 1.1 skrll case bfd_arch_rs6000: 4284 1.1 skrll internal_a.o_cputype = 4; 4285 1.1 skrll break; 4286 1.1 skrll case bfd_arch_powerpc: 4287 1.1 skrll if (bfd_get_mach (abfd) == bfd_mach_ppc) 4288 1.9 christos internal_a.o_cputype = 3; 4289 1.9 christos else if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 4290 1.1 skrll internal_a.o_cputype = 2; 4291 1.1 skrll else 4292 1.1 skrll internal_a.o_cputype = 1; 4293 1.1 skrll break; 4294 1.1 skrll default: 4295 1.1 skrll abort (); 4296 1.1 skrll } 4297 1.1 skrll } 4298 1.1 skrll internal_a.o_maxstack = xcoff_data (abfd)->maxstack; 4299 1.1 skrll internal_a.o_maxdata = xcoff_data (abfd)->maxdata; 4300 1.1 skrll } 4301 1.1 skrll #endif 4302 1.3 christos 4303 1.3 christos #ifdef COFF_WITH_PE 4304 1.3 christos { 4305 1.3 christos /* After object contents are finalized so we can compute a reasonable hash, 4306 1.3 christos but before header is written so we can update it to point to debug directory. */ 4307 1.3 christos struct pe_tdata *pe = pe_data (abfd); 4308 1.3 christos 4309 1.3 christos if (pe->build_id.after_write_object_contents != NULL) 4310 1.3 christos (*pe->build_id.after_write_object_contents) (abfd); 4311 1.3 christos } 4312 1.3 christos #endif 4313 1.3 christos 4314 1.10 christos /* Now write header. */ 4315 1.9 christos if (bfd_seek (abfd, 0, SEEK_SET) != 0) 4316 1.1 skrll return false; 4317 1.1 skrll 4318 1.1 skrll { 4319 1.1 skrll char * buff; 4320 1.1 skrll bfd_size_type amount = bfd_coff_filhsz (abfd); 4321 1.2 matt 4322 1.1 skrll buff = (char *) bfd_malloc (amount); 4323 1.9 christos if (buff == NULL) 4324 1.1 skrll return false; 4325 1.1 skrll 4326 1.10 christos bfd_coff_swap_filehdr_out (abfd, & internal_f, buff); 4327 1.1 skrll amount = bfd_write (buff, amount, abfd); 4328 1.1 skrll 4329 1.1 skrll free (buff); 4330 1.1 skrll 4331 1.9 christos if (amount != bfd_coff_filhsz (abfd)) 4332 1.1 skrll return false; 4333 1.1 skrll } 4334 1.1 skrll 4335 1.1 skrll if (abfd->flags & EXEC_P) 4336 1.1 skrll { 4337 1.1 skrll /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR. 4338 1.1 skrll include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)). */ 4339 1.1 skrll char * buff; 4340 1.1 skrll bfd_size_type amount = bfd_coff_aoutsz (abfd); 4341 1.2 matt 4342 1.1 skrll buff = (char *) bfd_malloc (amount); 4343 1.9 christos if (buff == NULL) 4344 1.1 skrll return false; 4345 1.1 skrll 4346 1.10 christos coff_swap_aouthdr_out (abfd, & internal_a, buff); 4347 1.1 skrll amount = bfd_write (buff, amount, abfd); 4348 1.1 skrll 4349 1.1 skrll free (buff); 4350 1.1 skrll 4351 1.9 christos if (amount != bfd_coff_aoutsz (abfd)) 4352 1.1 skrll return false; 4353 1.1 skrll 4354 1.1 skrll #ifdef COFF_IMAGE_WITH_PE 4355 1.9 christos if (! coff_apply_checksum (abfd)) 4356 1.1 skrll return false; 4357 1.1 skrll #endif 4358 1.1 skrll } 4359 1.9 christos #ifdef RS6000COFF_C 4360 1.1 skrll #ifndef XCOFF64 4361 1.1 skrll else 4362 1.1 skrll { 4363 1.1 skrll AOUTHDR buff; 4364 1.1 skrll size_t size; 4365 1.9 christos 4366 1.1 skrll /* XCOFF32 seems to always write at least a small a.out header. */ 4367 1.1 skrll coff_swap_aouthdr_out (abfd, & internal_a, & buff); 4368 1.1 skrll if (xcoff_data (abfd)->full_aouthdr) 4369 1.1 skrll size = bfd_coff_aoutsz (abfd); 4370 1.1 skrll else 4371 1.10 christos size = SMALL_AOUTSZ; 4372 1.9 christos if (bfd_write (&buff, size, abfd) != size) 4373 1.1 skrll return false; 4374 1.1 skrll } 4375 1.9 christos #endif 4376 1.1 skrll #endif 4377 1.9 christos 4378 1.1 skrll return true; 4379 1.1 skrll } 4380 1.9 christos 4381 1.1 skrll static bool 4382 1.1 skrll coff_set_section_contents (bfd * abfd, 4383 1.1 skrll sec_ptr section, 4384 1.1 skrll const void * location, 4385 1.1 skrll file_ptr offset, 4386 1.1 skrll bfd_size_type count) 4387 1.1 skrll { 4388 1.1 skrll if (! abfd->output_has_begun) /* Set by bfd.c handler. */ 4389 1.1 skrll { 4390 1.9 christos if (! coff_compute_section_file_positions (abfd)) 4391 1.1 skrll return false; 4392 1.1 skrll } 4393 1.1 skrll 4394 1.1 skrll #if defined(_LIB) && !defined(TARG_AUX) 4395 1.1 skrll /* The physical address field of a .lib section is used to hold the 4396 1.1 skrll number of shared libraries in the section. This code counts the 4397 1.1 skrll number of sections being written, and increments the lma field 4398 1.1 skrll with the number. 4399 1.1 skrll 4400 1.1 skrll I have found no documentation on the contents of this section. 4401 1.1 skrll Experimentation indicates that the section contains zero or more 4402 1.1 skrll records, each of which has the following structure: 4403 1.1 skrll 4404 1.1 skrll - a (four byte) word holding the length of this record, in words, 4405 1.1 skrll - a word that always seems to be set to "2", 4406 1.6 christos - the path to a shared library, null-terminated and then padded 4407 1.1 skrll to a whole word boundary. 4408 1.1 skrll 4409 1.1 skrll bfd_assert calls have been added to alert if an attempt is made 4410 1.1 skrll to write a section which doesn't follow these assumptions. The 4411 1.1 skrll code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe 4412 1.1 skrll <robertl (at) arnet.com> (Thanks!). 4413 1.1 skrll 4414 1.1 skrll Gvran Uddeborg <gvran (at) uddeborg.pp.se>. */ 4415 1.1 skrll if (strcmp (section->name, _LIB) == 0) 4416 1.1 skrll { 4417 1.1 skrll bfd_byte *rec, *recend; 4418 1.1 skrll 4419 1.1 skrll rec = (bfd_byte *) location; 4420 1.10 christos recend = rec + count; 4421 1.1 skrll while (recend - rec >= 4) 4422 1.10 christos { 4423 1.10 christos size_t len = bfd_get_32 (abfd, rec); 4424 1.10 christos if (len == 0 || len > (size_t) (recend - rec) / 4) 4425 1.10 christos break; 4426 1.1 skrll rec += len * 4; 4427 1.1 skrll ++section->lma; 4428 1.1 skrll } 4429 1.1 skrll 4430 1.1 skrll BFD_ASSERT (rec == recend); 4431 1.1 skrll } 4432 1.1 skrll #endif 4433 1.1 skrll 4434 1.1 skrll /* Don't write out bss sections - one way to do this is to 4435 1.1 skrll see if the filepos has not been set. */ 4436 1.9 christos if (section->filepos == 0) 4437 1.1 skrll return true; 4438 1.1 skrll 4439 1.9 christos if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) 4440 1.1 skrll return false; 4441 1.1 skrll 4442 1.9 christos if (count == 0) 4443 1.1 skrll return true; 4444 1.10 christos 4445 1.1 skrll return bfd_write (location, count, abfd) == count; 4446 1.1 skrll } 4447 1.1 skrll 4448 1.8 christos static void * 4449 1.8 christos buy_and_read (bfd *abfd, file_ptr where, 4450 1.1 skrll bfd_size_type nmemb, bfd_size_type size) 4451 1.9 christos { 4452 1.1 skrll size_t amt; 4453 1.9 christos 4454 1.9 christos if (_bfd_mul_overflow (nmemb, size, &amt)) 4455 1.9 christos { 4456 1.9 christos bfd_set_error (bfd_error_file_too_big); 4457 1.9 christos return NULL; 4458 1.9 christos } 4459 1.3 christos if (bfd_seek (abfd, where, SEEK_SET) != 0) 4460 1.9 christos return NULL; 4461 1.1 skrll return _bfd_malloc_and_read (abfd, amt, amt); 4462 1.1 skrll } 4463 1.1 skrll 4464 1.1 skrll /* 4465 1.1 skrll SUBSUBSECTION 4466 1.1 skrll Reading linenumbers 4467 1.1 skrll 4468 1.1 skrll Creating the linenumber table is done by reading in the entire 4469 1.1 skrll coff linenumber table, and creating another table for internal use. 4470 1.1 skrll 4471 1.1 skrll A coff linenumber table is structured so that each function 4472 1.1 skrll is marked as having a line number of 0. Each line within the 4473 1.1 skrll function is an offset from the first line in the function. The 4474 1.1 skrll base of the line number information for the table is stored in 4475 1.1 skrll the symbol associated with the function. 4476 1.1 skrll 4477 1.1 skrll Note: The PE format uses line number 0 for a flag indicating a 4478 1.1 skrll new source file. 4479 1.1 skrll 4480 1.1 skrll The information is copied from the external to the internal 4481 1.1 skrll table, and each symbol which marks a function is marked by 4482 1.1 skrll pointing its... 4483 1.1 skrll 4484 1.1 skrll How does this work ? 4485 1.1 skrll */ 4486 1.1 skrll 4487 1.1 skrll static int 4488 1.1 skrll coff_sort_func_alent (const void * arg1, const void * arg2) 4489 1.1 skrll { 4490 1.1 skrll const alent *al1 = *(const alent **) arg1; 4491 1.1 skrll const alent *al2 = *(const alent **) arg2; 4492 1.1 skrll const coff_symbol_type *s1 = (const coff_symbol_type *) (al1->u.sym); 4493 1.1 skrll const coff_symbol_type *s2 = (const coff_symbol_type *) (al2->u.sym); 4494 1.3 christos 4495 1.3 christos if (s1 == NULL || s2 == NULL) 4496 1.1 skrll return 0; 4497 1.1 skrll if (s1->symbol.value < s2->symbol.value) 4498 1.1 skrll return -1; 4499 1.1 skrll else if (s1->symbol.value > s2->symbol.value) 4500 1.1 skrll return 1; 4501 1.1 skrll 4502 1.1 skrll return 0; 4503 1.1 skrll } 4504 1.9 christos 4505 1.1 skrll static bool 4506 1.1 skrll coff_slurp_line_table (bfd *abfd, asection *asect) 4507 1.1 skrll { 4508 1.1 skrll LINENO *native_lineno; 4509 1.1 skrll alent *lineno_cache; 4510 1.1 skrll unsigned int counter; 4511 1.1 skrll alent *cache_ptr; 4512 1.9 christos bfd_vma prev_offset = 0; 4513 1.1 skrll bool ordered = true; 4514 1.1 skrll unsigned int nbr_func; 4515 1.9 christos LINENO *src; 4516 1.9 christos bool have_func; 4517 1.9 christos bool ret = true; 4518 1.1 skrll size_t amt; 4519 1.7 christos 4520 1.9 christos if (asect->lineno_count == 0) 4521 1.7 christos return true; 4522 1.1 skrll 4523 1.1 skrll BFD_ASSERT (asect->lineno == NULL); 4524 1.8 christos 4525 1.8 christos native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, 4526 1.8 christos asect->lineno_count, 4527 1.1 skrll bfd_coff_linesz (abfd)); 4528 1.1 skrll if (native_lineno == NULL) 4529 1.6 christos { 4530 1.7 christos _bfd_error_handler 4531 1.9 christos (_("%pB: warning: line number table read failed"), abfd); 4532 1.9 christos return false; 4533 1.9 christos } 4534 1.9 christos 4535 1.9 christos if (_bfd_mul_overflow (asect->lineno_count + 1, sizeof (alent), &amt)) 4536 1.9 christos { 4537 1.9 christos bfd_set_error (bfd_error_file_too_big); 4538 1.9 christos free (native_lineno); 4539 1.9 christos return false; 4540 1.9 christos } 4541 1.9 christos lineno_cache = (alent *) bfd_alloc (abfd, amt); 4542 1.9 christos if (lineno_cache == NULL) 4543 1.9 christos { 4544 1.9 christos free (native_lineno); 4545 1.1 skrll return false; 4546 1.1 skrll } 4547 1.1 skrll 4548 1.1 skrll cache_ptr = lineno_cache; 4549 1.1 skrll asect->lineno = lineno_cache; 4550 1.1 skrll src = native_lineno; 4551 1.9 christos nbr_func = 0; 4552 1.1 skrll have_func = false; 4553 1.3 christos 4554 1.1 skrll for (counter = 0; counter < asect->lineno_count; counter++, src++) 4555 1.1 skrll { 4556 1.1 skrll struct internal_lineno dst; 4557 1.1 skrll 4558 1.1 skrll bfd_coff_swap_lineno_in (abfd, src, &dst); 4559 1.3 christos cache_ptr->line_number = dst.l_lnno; 4560 1.3 christos /* Appease memory checkers that get all excited about 4561 1.3 christos uninitialised memory when copying alents if u.offset is 4562 1.3 christos larger than u.sym. (64-bit BFD on 32-bit host.) */ 4563 1.1 skrll memset (&cache_ptr->u, 0, sizeof (cache_ptr->u)); 4564 1.1 skrll 4565 1.1 skrll if (cache_ptr->line_number == 0) 4566 1.3 christos { 4567 1.6 christos combined_entry_type * ent; 4568 1.1 skrll unsigned long symndx; 4569 1.1 skrll coff_symbol_type *sym; 4570 1.9 christos 4571 1.1 skrll have_func = false; 4572 1.3 christos symndx = dst.l_addr.l_symndx; 4573 1.1 skrll if (symndx >= obj_raw_syment_count (abfd)) 4574 1.6 christos { 4575 1.6 christos _bfd_error_handler 4576 1.7 christos /* xgettext:c-format */ 4577 1.6 christos (_("%pB: warning: illegal symbol index 0x%lx in line number entry %d"), 4578 1.3 christos abfd, symndx, counter); 4579 1.9 christos cache_ptr->line_number = -1; 4580 1.3 christos ret = false; 4581 1.1 skrll continue; 4582 1.1 skrll } 4583 1.3 christos 4584 1.1 skrll ent = obj_raw_syments (abfd) + symndx; 4585 1.1 skrll /* FIXME: We should not be casting between ints and 4586 1.3 christos pointers like this. */ 4587 1.3 christos if (! ent->is_sym) 4588 1.6 christos { 4589 1.6 christos _bfd_error_handler 4590 1.7 christos /* xgettext:c-format */ 4591 1.6 christos (_("%pB: warning: illegal symbol index 0x%lx in line number entry %d"), 4592 1.3 christos abfd, symndx, counter); 4593 1.9 christos cache_ptr->line_number = -1; 4594 1.3 christos ret = false; 4595 1.3 christos continue; 4596 1.3 christos } 4597 1.3 christos sym = (coff_symbol_type *) (ent->u.syment._n._n_n._n_zeroes); 4598 1.3 christos 4599 1.3 christos /* PR 17512 file: 078-10659-0.004 */ 4600 1.3 christos if (sym < obj_symbols (abfd) 4601 1.3 christos || sym >= obj_symbols (abfd) + bfd_get_symcount (abfd)) 4602 1.6 christos { 4603 1.6 christos _bfd_error_handler 4604 1.7 christos /* xgettext:c-format */ 4605 1.3 christos (_("%pB: warning: illegal symbol in line number entry %d"), 4606 1.3 christos abfd, counter); 4607 1.9 christos cache_ptr->line_number = -1; 4608 1.3 christos ret = false; 4609 1.3 christos continue; 4610 1.3 christos } 4611 1.9 christos 4612 1.3 christos have_func = true; 4613 1.1 skrll nbr_func++; 4614 1.3 christos cache_ptr->u.sym = (asymbol *) sym; 4615 1.6 christos if (sym->lineno != NULL) 4616 1.6 christos _bfd_error_handler 4617 1.7 christos /* xgettext:c-format */ 4618 1.1 skrll (_("%pB: warning: duplicate line number information for `%s'"), 4619 1.1 skrll abfd, bfd_asymbol_name (&sym->symbol)); 4620 1.1 skrll 4621 1.1 skrll sym->lineno = cache_ptr; 4622 1.9 christos if (sym->symbol.value < prev_offset) 4623 1.1 skrll ordered = false; 4624 1.1 skrll prev_offset = sym->symbol.value; 4625 1.3 christos } 4626 1.3 christos else if (!have_func) 4627 1.3 christos /* Drop line information that has no associated function. 4628 1.3 christos PR 17521: file: 078-10659-0.004. */ 4629 1.1 skrll continue; 4630 1.8 christos else 4631 1.1 skrll cache_ptr->u.offset = dst.l_addr.l_paddr - bfd_section_vma (asect); 4632 1.1 skrll cache_ptr++; 4633 1.3 christos } 4634 1.3 christos 4635 1.3 christos asect->lineno_count = cache_ptr - lineno_cache; 4636 1.9 christos memset (cache_ptr, 0, sizeof (*cache_ptr)); 4637 1.1 skrll free (native_lineno); 4638 1.1 skrll 4639 1.1 skrll /* On some systems (eg AIX5.3) the lineno table may not be sorted. */ 4640 1.1 skrll if (!ordered) 4641 1.1 skrll { 4642 1.1 skrll /* Sort the table. */ 4643 1.1 skrll alent **func_table; 4644 1.1 skrll alent *n_lineno_cache; 4645 1.1 skrll 4646 1.9 christos /* Create a table of functions. */ 4647 1.9 christos if (_bfd_mul_overflow (nbr_func, sizeof (alent *), &amt)) 4648 1.9 christos { 4649 1.9 christos bfd_set_error (bfd_error_file_too_big); 4650 1.9 christos ret = false; 4651 1.9 christos } 4652 1.1 skrll else if ((func_table = (alent **) bfd_alloc (abfd, amt)) != NULL) 4653 1.1 skrll { 4654 1.1 skrll alent **p = func_table; 4655 1.1 skrll unsigned int i; 4656 1.3 christos 4657 1.1 skrll for (i = 0; i < asect->lineno_count; i++) 4658 1.1 skrll if (lineno_cache[i].line_number == 0) 4659 1.1 skrll *p++ = &lineno_cache[i]; 4660 1.3 christos 4661 1.3 christos BFD_ASSERT ((unsigned int) (p - func_table) == nbr_func); 4662 1.1 skrll 4663 1.1 skrll /* Sort by functions. */ 4664 1.1 skrll qsort (func_table, nbr_func, sizeof (alent *), coff_sort_func_alent); 4665 1.1 skrll 4666 1.9 christos /* Create the new sorted table. */ 4667 1.9 christos if (_bfd_mul_overflow (asect->lineno_count, sizeof (alent), &amt)) 4668 1.9 christos { 4669 1.9 christos bfd_set_error (bfd_error_file_too_big); 4670 1.9 christos ret = false; 4671 1.9 christos } 4672 1.1 skrll else if ((n_lineno_cache = (alent *) bfd_alloc (abfd, amt)) != NULL) 4673 1.1 skrll { 4674 1.1 skrll alent *n_cache_ptr = n_lineno_cache; 4675 1.1 skrll 4676 1.1 skrll for (i = 0; i < nbr_func; i++) 4677 1.1 skrll { 4678 1.1 skrll coff_symbol_type *sym; 4679 1.1 skrll alent *old_ptr = func_table[i]; 4680 1.3 christos 4681 1.3 christos /* Update the function entry. */ 4682 1.3 christos sym = (coff_symbol_type *) old_ptr->u.sym; 4683 1.3 christos /* PR binutils/17512: Point the lineno to where 4684 1.3 christos this entry will be after the memcpy below. */ 4685 1.3 christos sym->lineno = lineno_cache + (n_cache_ptr - n_lineno_cache); 4686 1.3 christos /* Copy the function and line number entries. */ 4687 1.1 skrll do 4688 1.3 christos *n_cache_ptr++ = *old_ptr++; 4689 1.1 skrll while (old_ptr->line_number != 0); 4690 1.3 christos } 4691 1.8 christos 4692 1.8 christos memcpy (lineno_cache, n_lineno_cache, 4693 1.1 skrll asect->lineno_count * sizeof (alent)); 4694 1.3 christos } 4695 1.9 christos else 4696 1.1 skrll ret = false; 4697 1.1 skrll bfd_release (abfd, func_table); 4698 1.3 christos } 4699 1.9 christos else 4700 1.1 skrll ret = false; 4701 1.1 skrll } 4702 1.3 christos 4703 1.1 skrll return ret; 4704 1.1 skrll } 4705 1.1 skrll 4706 1.1 skrll /* Slurp in the symbol table, converting it to generic form. Note 4707 1.1 skrll that if coff_relocate_section is defined, the linker will read 4708 1.1 skrll symbols via coff_link_add_symbols, rather than via this routine. */ 4709 1.9 christos 4710 1.1 skrll static bool 4711 1.1 skrll coff_slurp_symbol_table (bfd * abfd) 4712 1.1 skrll { 4713 1.1 skrll combined_entry_type *native_symbols; 4714 1.1 skrll coff_symbol_type *cached_area; 4715 1.1 skrll unsigned int *table_ptr; 4716 1.9 christos unsigned int number_of_symbols = 0; 4717 1.9 christos bool ret = true; 4718 1.1 skrll size_t amt; 4719 1.1 skrll 4720 1.9 christos if (obj_symbols (abfd)) 4721 1.1 skrll return true; 4722 1.1 skrll 4723 1.1 skrll /* Read in the symbol table. */ 4724 1.9 christos if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL) 4725 1.1 skrll return false; 4726 1.1 skrll 4727 1.9 christos /* Allocate enough room for all the symbols in cached form. */ 4728 1.9 christos if (_bfd_mul_overflow (obj_raw_syment_count (abfd), 4729 1.9 christos sizeof (*cached_area), &amt)) 4730 1.9 christos { 4731 1.9 christos bfd_set_error (bfd_error_file_too_big); 4732 1.9 christos return false; 4733 1.9 christos } 4734 1.1 skrll cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt); 4735 1.9 christos if (cached_area == NULL) 4736 1.1 skrll return false; 4737 1.9 christos 4738 1.9 christos if (_bfd_mul_overflow (obj_raw_syment_count (abfd), 4739 1.9 christos sizeof (*table_ptr), &amt)) 4740 1.9 christos { 4741 1.9 christos bfd_set_error (bfd_error_file_too_big); 4742 1.9 christos return false; 4743 1.9 christos } 4744 1.1 skrll table_ptr = (unsigned int *) bfd_zalloc (abfd, amt); 4745 1.9 christos if (table_ptr == NULL) 4746 1.1 skrll return false; 4747 1.1 skrll else 4748 1.1 skrll { 4749 1.1 skrll coff_symbol_type *dst = cached_area; 4750 1.1 skrll unsigned int last_native_index = obj_raw_syment_count (abfd); 4751 1.1 skrll unsigned int this_index = 0; 4752 1.1 skrll 4753 1.1 skrll while (this_index < last_native_index) 4754 1.1 skrll { 4755 1.1 skrll combined_entry_type *src = native_symbols + this_index; 4756 1.3 christos table_ptr[this_index] = number_of_symbols; 4757 1.1 skrll 4758 1.3 christos dst->symbol.the_bfd = abfd; 4759 1.1 skrll BFD_ASSERT (src->is_sym); 4760 1.1 skrll dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset); 4761 1.9 christos /* We use the native name field to point to the cached field. */ 4762 1.1 skrll src->u.syment._n._n_n._n_zeroes = (uintptr_t) dst; 4763 1.1 skrll dst->symbol.section = coff_section_from_bfd_index (abfd, 4764 1.1 skrll src->u.syment.n_scnum); 4765 1.3 christos dst->symbol.flags = 0; 4766 1.3 christos /* PR 17512: file: 079-7098-0.001:0.1. */ 4767 1.9 christos dst->symbol.value = 0; 4768 1.1 skrll dst->done_lineno = false; 4769 1.1 skrll 4770 1.1 skrll switch (src->u.syment.n_sclass) 4771 1.1 skrll { 4772 1.1 skrll case C_EXT: 4773 1.1 skrll case C_WEAKEXT: 4774 1.1 skrll #if defined ARM 4775 1.1 skrll case C_THUMBEXT: 4776 1.1 skrll case C_THUMBEXTFUNC: 4777 1.1 skrll #endif 4778 1.1 skrll #ifdef RS6000COFF_C 4779 1.10 christos case C_HIDEXT: 4780 1.6 christos #ifndef AIX_WEAK_SUPPORT 4781 1.6 christos case C_AIX_WEAKEXT: 4782 1.1 skrll #endif 4783 1.1 skrll #endif 4784 1.1 skrll #ifdef C_SYSTEM 4785 1.1 skrll case C_SYSTEM: /* System Wide variable. */ 4786 1.1 skrll #endif 4787 1.1 skrll #ifdef COFF_WITH_PE 4788 1.1 skrll /* In PE, 0x68 (104) denotes a section symbol. */ 4789 1.1 skrll case C_SECTION: 4790 1.1 skrll /* In PE, 0x69 (105) denotes a weak external symbol. */ 4791 1.1 skrll case C_NT_WEAK: 4792 1.1 skrll #endif 4793 1.1 skrll switch (coff_classify_symbol (abfd, &src->u.syment)) 4794 1.1 skrll { 4795 1.1 skrll case COFF_SYMBOL_GLOBAL: 4796 1.1 skrll dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; 4797 1.1 skrll #if defined COFF_WITH_PE 4798 1.1 skrll /* PE sets the symbol to a value relative to the 4799 1.1 skrll start of the section. */ 4800 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4801 1.1 skrll #else 4802 1.1 skrll dst->symbol.value = (src->u.syment.n_value 4803 1.1 skrll - dst->symbol.section->vma); 4804 1.1 skrll #endif 4805 1.1 skrll if (ISFCN ((src->u.syment.n_type))) 4806 1.1 skrll /* A function ext does not go at the end of a 4807 1.1 skrll file. */ 4808 1.1 skrll dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION; 4809 1.1 skrll break; 4810 1.1 skrll 4811 1.1 skrll case COFF_SYMBOL_COMMON: 4812 1.1 skrll dst->symbol.section = bfd_com_section_ptr; 4813 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4814 1.1 skrll break; 4815 1.1 skrll 4816 1.1 skrll case COFF_SYMBOL_UNDEFINED: 4817 1.1 skrll dst->symbol.section = bfd_und_section_ptr; 4818 1.1 skrll dst->symbol.value = 0; 4819 1.1 skrll break; 4820 1.1 skrll 4821 1.1 skrll case COFF_SYMBOL_PE_SECTION: 4822 1.1 skrll dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM; 4823 1.1 skrll dst->symbol.value = 0; 4824 1.1 skrll break; 4825 1.1 skrll 4826 1.1 skrll case COFF_SYMBOL_LOCAL: 4827 1.1 skrll dst->symbol.flags = BSF_LOCAL; 4828 1.1 skrll #if defined COFF_WITH_PE 4829 1.1 skrll /* PE sets the symbol to a value relative to the 4830 1.1 skrll start of the section. */ 4831 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4832 1.1 skrll #else 4833 1.1 skrll dst->symbol.value = (src->u.syment.n_value 4834 1.1 skrll - dst->symbol.section->vma); 4835 1.1 skrll #endif 4836 1.1 skrll if (ISFCN ((src->u.syment.n_type))) 4837 1.1 skrll dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION; 4838 1.1 skrll break; 4839 1.1 skrll } 4840 1.1 skrll 4841 1.1 skrll #ifdef RS6000COFF_C 4842 1.1 skrll /* A symbol with a csect entry should not go at the end. */ 4843 1.1 skrll if (src->u.syment.n_numaux > 0) 4844 1.1 skrll dst->symbol.flags |= BSF_NOT_AT_END; 4845 1.1 skrll #endif 4846 1.1 skrll 4847 1.1 skrll #ifdef COFF_WITH_PE 4848 1.1 skrll if (src->u.syment.n_sclass == C_NT_WEAK) 4849 1.1 skrll dst->symbol.flags |= BSF_WEAK; 4850 1.1 skrll 4851 1.1 skrll if (src->u.syment.n_sclass == C_SECTION 4852 1.1 skrll && src->u.syment.n_scnum > 0) 4853 1.1 skrll dst->symbol.flags = BSF_LOCAL; 4854 1.6 christos #endif 4855 1.6 christos if (src->u.syment.n_sclass == C_WEAKEXT 4856 1.6 christos #ifdef RS6000COFF_C 4857 1.6 christos || src->u.syment.n_sclass == C_AIX_WEAKEXT 4858 1.6 christos #endif 4859 1.1 skrll ) 4860 1.1 skrll dst->symbol.flags |= BSF_WEAK; 4861 1.1 skrll 4862 1.1 skrll break; 4863 1.1 skrll 4864 1.1 skrll case C_STAT: /* Static. */ 4865 1.1 skrll #if defined ARM 4866 1.1 skrll case C_THUMBSTAT: /* Thumb static. */ 4867 1.1 skrll case C_THUMBLABEL: /* Thumb label. */ 4868 1.1 skrll case C_THUMBSTATFUNC:/* Thumb static function. */ 4869 1.2 matt #endif 4870 1.6 christos #ifdef RS6000COFF_C 4871 1.6 christos case C_DWARF: /* A label in a dwarf section. */ 4872 1.2 matt case C_INFO: /* A label in a comment section. */ 4873 1.1 skrll #endif 4874 1.1 skrll case C_LABEL: /* Label. */ 4875 1.1 skrll if (src->u.syment.n_scnum == N_DEBUG) 4876 1.1 skrll dst->symbol.flags = BSF_DEBUGGING; 4877 1.1 skrll else 4878 1.1 skrll dst->symbol.flags = BSF_LOCAL; 4879 1.1 skrll 4880 1.1 skrll /* Base the value as an index from the base of the 4881 1.1 skrll section, if there is one. */ 4882 1.1 skrll if (dst->symbol.section) 4883 1.1 skrll { 4884 1.1 skrll #if defined COFF_WITH_PE 4885 1.1 skrll /* PE sets the symbol to a value relative to the 4886 1.1 skrll start of the section. */ 4887 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4888 1.1 skrll #else 4889 1.1 skrll dst->symbol.value = (src->u.syment.n_value 4890 1.1 skrll - dst->symbol.section->vma); 4891 1.1 skrll #endif 4892 1.1 skrll } 4893 1.1 skrll else 4894 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4895 1.1 skrll break; 4896 1.9 christos 4897 1.9 christos case C_FILE: /* File name. */ 4898 1.9 christos dst->symbol.flags = BSF_FILE; 4899 1.1 skrll /* Fall through. */ 4900 1.1 skrll case C_MOS: /* Member of structure. */ 4901 1.1 skrll case C_EOS: /* End of structure. */ 4902 1.1 skrll case C_REGPARM: /* Register parameter. */ 4903 1.1 skrll case C_REG: /* register variable. */ 4904 1.1 skrll /* C_AUTOARG conflicts with TI COFF C_UEXT. */ 4905 1.1 skrll case C_TPDEF: /* Type definition. */ 4906 1.1 skrll case C_ARG: 4907 1.1 skrll case C_AUTO: /* Automatic variable. */ 4908 1.1 skrll case C_FIELD: /* Bit field. */ 4909 1.1 skrll case C_ENTAG: /* Enumeration tag. */ 4910 1.1 skrll case C_MOE: /* Member of enumeration. */ 4911 1.1 skrll case C_MOU: /* Member of union. */ 4912 1.1 skrll case C_UNTAG: /* Union tag. */ 4913 1.1 skrll case C_STRTAG: /* Structure tag. */ 4914 1.1 skrll #ifdef RS6000COFF_C 4915 1.1 skrll case C_GSYM: 4916 1.1 skrll case C_LSYM: 4917 1.1 skrll case C_PSYM: 4918 1.1 skrll case C_RSYM: 4919 1.1 skrll case C_RPSYM: 4920 1.1 skrll case C_STSYM: 4921 1.1 skrll case C_TCSYM: 4922 1.1 skrll case C_BCOMM: 4923 1.1 skrll case C_ECOML: 4924 1.1 skrll case C_ECOMM: 4925 1.1 skrll case C_DECL: 4926 1.1 skrll case C_ENTRY: 4927 1.1 skrll case C_FUN: 4928 1.1 skrll case C_ESTAT: 4929 1.9 christos #endif 4930 1.1 skrll dst->symbol.flags |= BSF_DEBUGGING; 4931 1.1 skrll dst->symbol.value = (src->u.syment.n_value); 4932 1.1 skrll break; 4933 1.1 skrll 4934 1.1 skrll #ifdef RS6000COFF_C 4935 1.1 skrll case C_BINCL: /* Beginning of include file. */ 4936 1.1 skrll case C_EINCL: /* Ending of include file. */ 4937 1.1 skrll /* The value is actually a pointer into the line numbers 4938 1.1 skrll of the file. We locate the line number entry, and 4939 1.1 skrll set the section to the section which contains it, and 4940 1.1 skrll the value to the index in that section. */ 4941 1.1 skrll { 4942 1.1 skrll asection *sec; 4943 1.1 skrll 4944 1.1 skrll dst->symbol.flags = BSF_DEBUGGING; 4945 1.1 skrll for (sec = abfd->sections; sec != NULL; sec = sec->next) 4946 1.1 skrll if (sec->line_filepos <= (file_ptr) src->u.syment.n_value 4947 1.1 skrll && ((file_ptr) (sec->line_filepos 4948 1.1 skrll + sec->lineno_count * bfd_coff_linesz (abfd)) 4949 1.1 skrll > (file_ptr) src->u.syment.n_value)) 4950 1.1 skrll break; 4951 1.1 skrll if (sec == NULL) 4952 1.1 skrll dst->symbol.value = 0; 4953 1.1 skrll else 4954 1.1 skrll { 4955 1.1 skrll dst->symbol.section = sec; 4956 1.1 skrll dst->symbol.value = ((src->u.syment.n_value 4957 1.1 skrll - sec->line_filepos) 4958 1.1 skrll / bfd_coff_linesz (abfd)); 4959 1.1 skrll src->fix_line = 1; 4960 1.1 skrll } 4961 1.1 skrll } 4962 1.1 skrll break; 4963 1.1 skrll 4964 1.1 skrll case C_BSTAT: 4965 1.1 skrll dst->symbol.flags = BSF_DEBUGGING; 4966 1.10 christos 4967 1.10 christos if (src->u.syment.n_value >= obj_raw_syment_count (abfd)) 4968 1.10 christos dst->symbol.value = 0; 4969 1.10 christos else 4970 1.10 christos { 4971 1.10 christos /* The value is actually a symbol index. Save a pointer 4972 1.10 christos to the symbol instead of the index. FIXME: This 4973 1.10 christos should use a union. */ 4974 1.10 christos src->u.syment.n_value 4975 1.10 christos = (uintptr_t) (native_symbols + src->u.syment.n_value); 4976 1.10 christos dst->symbol.value = src->u.syment.n_value; 4977 1.10 christos src->fix_value = 1; 4978 1.1 skrll } 4979 1.1 skrll break; 4980 1.1 skrll #endif 4981 1.1 skrll 4982 1.1 skrll case C_BLOCK: /* ".bb" or ".eb". */ 4983 1.1 skrll case C_FCN: /* ".bf" or ".ef" (or PE ".lf"). */ 4984 1.1 skrll case C_EFCN: /* Physical end of function. */ 4985 1.1 skrll #if defined COFF_WITH_PE 4986 1.1 skrll /* PE sets the symbol to a value relative to the start 4987 1.1 skrll of the section. */ 4988 1.1 skrll dst->symbol.value = src->u.syment.n_value; 4989 1.1 skrll if (strcmp (dst->symbol.name, ".bf") != 0) 4990 1.1 skrll { 4991 1.1 skrll /* PE uses funny values for .ef and .lf; don't 4992 1.1 skrll relocate them. */ 4993 1.1 skrll dst->symbol.flags = BSF_DEBUGGING; 4994 1.1 skrll } 4995 1.1 skrll else 4996 1.1 skrll dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC; 4997 1.1 skrll #else 4998 1.1 skrll /* Base the value as an index from the base of the 4999 1.1 skrll section. */ 5000 1.1 skrll dst->symbol.flags = BSF_LOCAL; 5001 1.1 skrll dst->symbol.value = (src->u.syment.n_value 5002 1.1 skrll - dst->symbol.section->vma); 5003 1.1 skrll #endif 5004 1.1 skrll break; 5005 1.1 skrll 5006 1.1 skrll case C_STATLAB: /* Static load time label. */ 5007 1.1 skrll dst->symbol.value = src->u.syment.n_value; 5008 1.1 skrll dst->symbol.flags = BSF_GLOBAL; 5009 1.1 skrll break; 5010 1.1 skrll 5011 1.1 skrll case C_NULL: 5012 1.1 skrll /* PE DLLs sometimes have zeroed out symbols for some 5013 1.1 skrll reason. Just ignore them without a warning. */ 5014 1.1 skrll if (src->u.syment.n_type == 0 5015 1.1 skrll && src->u.syment.n_value == 0 5016 1.1 skrll && src->u.syment.n_scnum == 0) 5017 1.2 matt break; 5018 1.6 christos #ifdef RS6000COFF_C 5019 1.6 christos /* XCOFF specific: deleted entry. */ 5020 1.6 christos if (src->u.syment.n_value == C_NULL_VALUE) 5021 1.2 matt break; 5022 1.1 skrll #endif 5023 1.1 skrll /* Fall through. */ 5024 1.1 skrll case C_EXTDEF: /* External definition. */ 5025 1.1 skrll case C_ULABEL: /* Undefined label. */ 5026 1.1 skrll case C_USTATIC: /* Undefined static. */ 5027 1.1 skrll #ifndef COFF_WITH_PE 5028 1.1 skrll /* C_LINE in regular coff is 0x68. NT has taken over this storage 5029 1.1 skrll class to represent a section symbol. */ 5030 1.1 skrll case C_LINE: /* line # reformatted as symbol table entry. */ 5031 1.1 skrll /* NT uses 0x67 for a weak symbol, not C_ALIAS. */ 5032 1.1 skrll case C_ALIAS: /* Duplicate tag. */ 5033 1.1 skrll #endif 5034 1.8 christos /* New storage classes for TI COFF. */ 5035 1.1 skrll #ifdef TICOFF 5036 1.1 skrll case C_UEXT: /* Tentative external definition. */ 5037 1.6 christos #endif 5038 1.1 skrll case C_EXTLAB: /* External load time label. */ 5039 1.6 christos default: 5040 1.6 christos _bfd_error_handler 5041 1.7 christos /* xgettext:c-format */ 5042 1.1 skrll (_("%pB: unrecognized storage class %d for %s symbol `%s'"), 5043 1.1 skrll abfd, src->u.syment.n_sclass, 5044 1.9 christos dst->symbol.section->name, dst->symbol.name); 5045 1.6 christos ret = false; 5046 1.3 christos /* Fall through. */ 5047 1.6 christos case C_HIDDEN: /* Ext symbol in dmert public lib. */ 5048 1.6 christos /* PR 20722: These symbols can also be generated by 5049 1.1 skrll building DLLs with --gc-sections enabled. */ 5050 1.1 skrll dst->symbol.flags = BSF_DEBUGGING; 5051 1.1 skrll dst->symbol.value = (src->u.syment.n_value); 5052 1.1 skrll break; 5053 1.1 skrll } 5054 1.1 skrll 5055 1.1 skrll dst->native = src; 5056 1.1 skrll dst->symbol.udata.i = 0; 5057 1.3 christos dst->lineno = NULL; 5058 1.1 skrll 5059 1.1 skrll this_index += (src->u.syment.n_numaux) + 1; 5060 1.1 skrll dst++; 5061 1.1 skrll number_of_symbols++; 5062 1.1 skrll } 5063 1.1 skrll } 5064 1.1 skrll 5065 1.1 skrll obj_symbols (abfd) = cached_area; 5066 1.1 skrll obj_raw_syments (abfd) = native_symbols; 5067 1.8 christos 5068 1.1 skrll abfd->symcount = number_of_symbols; 5069 1.1 skrll obj_convert (abfd) = table_ptr; 5070 1.1 skrll /* Slurp the line tables for each section too. */ 5071 1.1 skrll { 5072 1.1 skrll asection *p; 5073 1.1 skrll 5074 1.1 skrll p = abfd->sections; 5075 1.1 skrll while (p) 5076 1.3 christos { 5077 1.9 christos if (! coff_slurp_line_table (abfd, p)) 5078 1.1 skrll return false; 5079 1.1 skrll p = p->next; 5080 1.1 skrll } 5081 1.1 skrll } 5082 1.3 christos 5083 1.1 skrll return ret; 5084 1.1 skrll } 5085 1.1 skrll 5086 1.1 skrll /* Classify a COFF symbol. A couple of targets have globally visible 5087 1.1 skrll symbols which are not class C_EXT, and this handles those. It also 5088 1.1 skrll recognizes some special PE cases. */ 5089 1.1 skrll 5090 1.1 skrll static enum coff_symbol_classification 5091 1.1 skrll coff_classify_symbol (bfd *abfd, 5092 1.1 skrll struct internal_syment *syment) 5093 1.1 skrll { 5094 1.1 skrll /* FIXME: This partially duplicates the switch in 5095 1.1 skrll coff_slurp_symbol_table. */ 5096 1.1 skrll switch (syment->n_sclass) 5097 1.1 skrll { 5098 1.1 skrll case C_EXT: 5099 1.1 skrll case C_WEAKEXT: 5100 1.1 skrll #ifdef ARM 5101 1.1 skrll case C_THUMBEXT: 5102 1.1 skrll case C_THUMBEXTFUNC: 5103 1.9 christos #endif 5104 1.9 christos #ifdef RS6000COFF_C 5105 1.10 christos case C_HIDEXT: 5106 1.9 christos #ifndef AIX_WEAK_SUPPORT 5107 1.9 christos case C_AIX_WEAKEXT: 5108 1.9 christos #endif 5109 1.1 skrll #endif 5110 1.1 skrll #ifdef C_SYSTEM 5111 1.1 skrll case C_SYSTEM: 5112 1.1 skrll #endif 5113 1.1 skrll #ifdef COFF_WITH_PE 5114 1.1 skrll case C_NT_WEAK: 5115 1.1 skrll #endif 5116 1.1 skrll if (syment->n_scnum == 0) 5117 1.1 skrll { 5118 1.1 skrll if (syment->n_value == 0) 5119 1.1 skrll return COFF_SYMBOL_UNDEFINED; 5120 1.1 skrll else 5121 1.1 skrll return COFF_SYMBOL_COMMON; 5122 1.9 christos } 5123 1.9 christos #ifdef RS6000COFF_C 5124 1.9 christos if (syment->n_sclass == C_HIDEXT) 5125 1.9 christos return COFF_SYMBOL_LOCAL; 5126 1.1 skrll #endif 5127 1.1 skrll return COFF_SYMBOL_GLOBAL; 5128 1.1 skrll 5129 1.1 skrll default: 5130 1.1 skrll break; 5131 1.1 skrll } 5132 1.1 skrll 5133 1.1 skrll #ifdef COFF_WITH_PE 5134 1.1 skrll if (syment->n_sclass == C_STAT) 5135 1.1 skrll { 5136 1.1 skrll if (syment->n_scnum == 0) 5137 1.1 skrll /* The Microsoft compiler sometimes generates these if a 5138 1.1 skrll small static function is inlined every time it is used. 5139 1.1 skrll The function is discarded, but the symbol table entry 5140 1.1 skrll remains. */ 5141 1.1 skrll return COFF_SYMBOL_LOCAL; 5142 1.1 skrll 5143 1.1 skrll #ifdef STRICT_PE_FORMAT 5144 1.1 skrll /* This is correct for Microsoft generated objects, but it 5145 1.1 skrll breaks gas generated objects. */ 5146 1.1 skrll if (syment->n_value == 0) 5147 1.10 christos { 5148 1.10 christos const asection *sec; 5149 1.6 christos const char *name; 5150 1.1 skrll char buf[SYMNMLEN + 1]; 5151 1.10 christos 5152 1.6 christos name = _bfd_coff_internal_syment_name (abfd, syment, buf); 5153 1.3 christos sec = coff_section_from_bfd_index (abfd, syment->n_scnum); 5154 1.8 christos if (sec != NULL && name != NULL 5155 1.1 skrll && (strcmp (bfd_section_name (sec), name) == 0)) 5156 1.1 skrll return COFF_SYMBOL_PE_SECTION; 5157 1.1 skrll } 5158 1.1 skrll #endif 5159 1.1 skrll 5160 1.1 skrll return COFF_SYMBOL_LOCAL; 5161 1.1 skrll } 5162 1.1 skrll 5163 1.1 skrll if (syment->n_sclass == C_SECTION) 5164 1.1 skrll { 5165 1.1 skrll /* In some cases in a DLL generated by the Microsoft linker, the 5166 1.1 skrll n_value field will contain garbage. FIXME: This should 5167 1.1 skrll probably be handled by the swapping function instead. */ 5168 1.1 skrll syment->n_value = 0; 5169 1.1 skrll if (syment->n_scnum == 0) 5170 1.1 skrll return COFF_SYMBOL_UNDEFINED; 5171 1.1 skrll return COFF_SYMBOL_PE_SECTION; 5172 1.1 skrll } 5173 1.1 skrll #endif /* COFF_WITH_PE */ 5174 1.1 skrll 5175 1.1 skrll /* If it is not a global symbol, we presume it is a local symbol. */ 5176 1.1 skrll if (syment->n_scnum == 0) 5177 1.1 skrll { 5178 1.1 skrll char buf[SYMNMLEN + 1]; 5179 1.6 christos 5180 1.6 christos _bfd_error_handler 5181 1.7 christos /* xgettext:c-format */ 5182 1.1 skrll (_("warning: %pB: local symbol `%s' has no section"), 5183 1.1 skrll abfd, _bfd_coff_internal_syment_name (abfd, syment, buf)); 5184 1.1 skrll } 5185 1.1 skrll 5186 1.1 skrll return COFF_SYMBOL_LOCAL; 5187 1.1 skrll } 5188 1.1 skrll 5189 1.1 skrll /* 5190 1.1 skrll SUBSUBSECTION 5191 1.1 skrll Reading relocations 5192 1.1 skrll 5193 1.1 skrll Coff relocations are easily transformed into the internal BFD form 5194 1.1 skrll (@code{arelent}). 5195 1.1 skrll 5196 1.1 skrll Reading a coff relocation table is done in the following stages: 5197 1.1 skrll 5198 1.1 skrll o Read the entire coff relocation table into memory. 5199 1.1 skrll 5200 1.1 skrll o Process each relocation in turn; first swap it from the 5201 1.1 skrll external to the internal form. 5202 1.1 skrll 5203 1.1 skrll o Turn the symbol referenced in the relocation's symbol index 5204 1.1 skrll into a pointer into the canonical symbol table. 5205 1.1 skrll This table is the same as the one returned by a call to 5206 1.1 skrll @code{bfd_canonicalize_symtab}. The back end will call that 5207 1.1 skrll routine and save the result if a canonicalization hasn't been done. 5208 1.1 skrll 5209 1.1 skrll o The reloc index is turned into a pointer to a howto 5210 1.7 christos structure, in a back end specific way. For instance, the 386 5211 1.7 christos uses the @code{r_type} to directly produce an index 5212 1.10 christos into a howto table vector. 5213 1.10 christos 5214 1.10 christos o Note that @code{arelent.addend} for COFF is often not what 5215 1.10 christos most people understand as a relocation addend, but rather an 5216 1.10 christos adjustment to the relocation addend stored in section contents 5217 1.10 christos of relocatable object files. The value found in section 5218 1.10 christos contents may also be confusing, depending on both symbol value 5219 1.10 christos and addend somewhat similar to the field value for a 5220 1.1 skrll final-linked object. See @code{CALC_ADDEND}. 5221 1.1 skrll */ 5222 1.10 christos 5223 1.10 christos #ifdef COFF_WITH_PE 5224 1.10 christos #define COFF_PE_ADDEND_BIAS(ptr) 0 /* Symbol value not stored in raw data. */ 5225 1.10 christos #else 5226 1.10 christos #define COFF_PE_ADDEND_BIAS(ptr) ((ptr)->value) 5227 1.10 christos #endif 5228 1.1 skrll 5229 1.1 skrll #ifndef CALC_ADDEND 5230 1.1 skrll #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ 5231 1.1 skrll { \ 5232 1.1 skrll coff_symbol_type *coffsym = NULL; \ 5233 1.1 skrll \ 5234 1.1 skrll if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ 5235 1.1 skrll coffsym = (obj_symbols (abfd) \ 5236 1.1 skrll + (cache_ptr->sym_ptr_ptr - symbols)); \ 5237 1.3 christos else if (ptr) \ 5238 1.1 skrll coffsym = coff_symbol_from (ptr); \ 5239 1.3 christos if (coffsym != NULL \ 5240 1.1 skrll && coffsym->native->is_sym \ 5241 1.1 skrll && coffsym->native->u.syment.n_scnum == 0) \ 5242 1.1 skrll cache_ptr->addend = 0; \ 5243 1.1 skrll else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ 5244 1.10 christos && ptr->section != NULL) \ 5245 1.10 christos cache_ptr->addend = - (ptr->section->vma \ 5246 1.1 skrll + COFF_PE_ADDEND_BIAS (ptr)); \ 5247 1.1 skrll else \ 5248 1.1 skrll cache_ptr->addend = 0; \ 5249 1.1 skrll } 5250 1.1 skrll #endif 5251 1.9 christos 5252 1.1 skrll static bool 5253 1.1 skrll coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols) 5254 1.9 christos { 5255 1.1 skrll bfd_byte *native_relocs; 5256 1.1 skrll arelent *reloc_cache; 5257 1.1 skrll arelent *cache_ptr; 5258 1.9 christos unsigned int idx; 5259 1.1 skrll size_t amt; 5260 1.1 skrll 5261 1.9 christos if (asect->relocation) 5262 1.1 skrll return true; 5263 1.9 christos if (asect->reloc_count == 0) 5264 1.1 skrll return true; 5265 1.9 christos if (asect->flags & SEC_CONSTRUCTOR) 5266 1.1 skrll return true; 5267 1.9 christos if (!coff_slurp_symbol_table (abfd)) 5268 1.1 skrll return false; 5269 1.9 christos 5270 1.9 christos native_relocs = (bfd_byte *) buy_and_read (abfd, asect->rel_filepos, 5271 1.9 christos asect->reloc_count, 5272 1.9 christos bfd_coff_relsz (abfd)); 5273 1.9 christos if (native_relocs == NULL) 5274 1.1 skrll return false; 5275 1.9 christos 5276 1.9 christos if (_bfd_mul_overflow (asect->reloc_count, sizeof (arelent), &amt)) 5277 1.9 christos { 5278 1.9 christos bfd_set_error (bfd_error_file_too_big); 5279 1.9 christos return false; 5280 1.9 christos } 5281 1.9 christos reloc_cache = (arelent *) bfd_alloc (abfd, amt); 5282 1.9 christos if (reloc_cache == NULL) 5283 1.9 christos { 5284 1.9 christos free (native_relocs); 5285 1.9 christos return false; 5286 1.1 skrll } 5287 1.1 skrll 5288 1.1 skrll for (idx = 0; idx < asect->reloc_count; idx++) 5289 1.1 skrll { 5290 1.9 christos struct internal_reloc dst; 5291 1.1 skrll void *src; 5292 1.1 skrll #ifndef RELOC_PROCESSING 5293 1.1 skrll asymbol *ptr; 5294 1.1 skrll #endif 5295 1.1 skrll 5296 1.9 christos cache_ptr = reloc_cache + idx; 5297 1.1 skrll src = native_relocs + idx * (size_t) bfd_coff_relsz (abfd); 5298 1.1 skrll 5299 1.9 christos dst.r_offset = 0; 5300 1.1 skrll bfd_coff_swap_reloc_in (abfd, src, &dst); 5301 1.1 skrll 5302 1.1 skrll #ifdef RELOC_PROCESSING 5303 1.1 skrll RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect); 5304 1.1 skrll #else 5305 1.1 skrll cache_ptr->address = dst.r_vaddr; 5306 1.6 christos 5307 1.1 skrll if (dst.r_symndx != -1 && symbols != NULL) 5308 1.1 skrll { 5309 1.1 skrll if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd)) 5310 1.6 christos { 5311 1.6 christos _bfd_error_handler 5312 1.7 christos /* xgettext:c-format */ 5313 1.6 christos (_("%pB: warning: illegal symbol index %ld in relocs"), 5314 1.11 christos abfd, dst.r_symndx); 5315 1.1 skrll cache_ptr->sym_ptr_ptr = &bfd_abs_section_ptr->symbol; 5316 1.1 skrll ptr = NULL; 5317 1.1 skrll } 5318 1.1 skrll else 5319 1.1 skrll { 5320 1.1 skrll cache_ptr->sym_ptr_ptr = (symbols 5321 1.1 skrll + obj_convert (abfd)[dst.r_symndx]); 5322 1.1 skrll ptr = *(cache_ptr->sym_ptr_ptr); 5323 1.1 skrll } 5324 1.1 skrll } 5325 1.1 skrll else 5326 1.11 christos { 5327 1.1 skrll cache_ptr->sym_ptr_ptr = &bfd_abs_section_ptr->symbol; 5328 1.1 skrll ptr = NULL; 5329 1.1 skrll } 5330 1.1 skrll 5331 1.1 skrll /* The symbols definitions that we have read in have been 5332 1.1 skrll relocated as if their sections started at 0. But the offsets 5333 1.1 skrll refering to the symbols in the raw data have not been 5334 1.1 skrll modified, so we have to have a negative addend to compensate. 5335 1.1 skrll 5336 1.1 skrll Note that symbols which used to be common must be left alone. */ 5337 1.1 skrll 5338 1.1 skrll /* Calculate any reloc addend by looking at the symbol. */ 5339 1.2 matt CALC_ADDEND (abfd, ptr, dst, cache_ptr); 5340 1.1 skrll (void) ptr; 5341 1.1 skrll 5342 1.1 skrll cache_ptr->address -= asect->vma; 5343 1.1 skrll /* !! cache_ptr->section = NULL;*/ 5344 1.1 skrll 5345 1.1 skrll /* Fill in the cache_ptr->howto field from dst.r_type. */ 5346 1.1 skrll RTYPE2HOWTO (cache_ptr, &dst); 5347 1.1 skrll #endif /* RELOC_PROCESSING */ 5348 1.12 christos 5349 1.1 skrll if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL) 5350 1.6 christos { 5351 1.6 christos _bfd_error_handler 5352 1.7 christos /* xgettext:c-format */ 5353 1.7 christos (_("%pB: illegal relocation type %d at address %#" PRIx64), 5354 1.1 skrll abfd, dst.r_type, (uint64_t) dst.r_vaddr); 5355 1.9 christos bfd_set_error (bfd_error_bad_value); 5356 1.9 christos free (native_relocs); 5357 1.1 skrll return false; 5358 1.1 skrll } 5359 1.1 skrll } 5360 1.9 christos 5361 1.1 skrll free (native_relocs); 5362 1.9 christos asect->relocation = reloc_cache; 5363 1.1 skrll return true; 5364 1.1 skrll } 5365 1.1 skrll 5366 1.1 skrll #ifndef coff_rtype_to_howto 5367 1.1 skrll #ifdef RTYPE2HOWTO 5368 1.1 skrll 5369 1.1 skrll /* Get the howto structure for a reloc. This is only used if the file 5370 1.1 skrll including this one defines coff_relocate_section to be 5371 1.1 skrll _bfd_coff_generic_relocate_section, so it is OK if it does not 5372 1.1 skrll always work. It is the responsibility of the including file to 5373 1.1 skrll make sure it is reasonable if it is needed. */ 5374 1.1 skrll 5375 1.1 skrll static reloc_howto_type * 5376 1.1 skrll coff_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, 5377 1.3 christos asection *sec ATTRIBUTE_UNUSED, 5378 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED, 5379 1.1 skrll struct coff_link_hash_entry *h ATTRIBUTE_UNUSED, 5380 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED, 5381 1.1 skrll bfd_vma *addendp ATTRIBUTE_UNUSED) 5382 1.1 skrll { 5383 1.1 skrll arelent genrel; 5384 1.1 skrll 5385 1.1 skrll genrel.howto = NULL; 5386 1.1 skrll RTYPE2HOWTO (&genrel, rel); 5387 1.1 skrll return genrel.howto; 5388 1.1 skrll } 5389 1.1 skrll 5390 1.1 skrll #else /* ! defined (RTYPE2HOWTO) */ 5391 1.1 skrll 5392 1.1 skrll #define coff_rtype_to_howto NULL 5393 1.1 skrll 5394 1.1 skrll #endif /* ! defined (RTYPE2HOWTO) */ 5395 1.1 skrll #endif /* ! defined (coff_rtype_to_howto) */ 5396 1.1 skrll 5397 1.1 skrll /* This is stupid. This function should be a boolean predicate. */ 5398 1.1 skrll 5399 1.1 skrll static long 5400 1.1 skrll coff_canonicalize_reloc (bfd * abfd, 5401 1.1 skrll sec_ptr section, 5402 1.1 skrll arelent ** relptr, 5403 1.1 skrll asymbol ** symbols) 5404 1.1 skrll { 5405 1.1 skrll arelent *tblptr = section->relocation; 5406 1.1 skrll unsigned int count = 0; 5407 1.1 skrll 5408 1.1 skrll if (section->flags & SEC_CONSTRUCTOR) 5409 1.1 skrll { 5410 1.1 skrll /* This section has relocs made up by us, they are not in the 5411 1.1 skrll file, so take them out of their chain and place them into 5412 1.1 skrll the data area provided. */ 5413 1.1 skrll arelent_chain *chain = section->constructor_chain; 5414 1.1 skrll 5415 1.1 skrll for (count = 0; count < section->reloc_count; count++) 5416 1.1 skrll { 5417 1.1 skrll *relptr++ = &chain->relent; 5418 1.1 skrll chain = chain->next; 5419 1.1 skrll } 5420 1.1 skrll } 5421 1.1 skrll else 5422 1.1 skrll { 5423 1.1 skrll if (! coff_slurp_reloc_table (abfd, section, symbols)) 5424 1.1 skrll return -1; 5425 1.1 skrll 5426 1.1 skrll tblptr = section->relocation; 5427 1.1 skrll 5428 1.1 skrll for (; count++ < section->reloc_count;) 5429 1.1 skrll *relptr++ = tblptr++; 5430 1.1 skrll } 5431 1.1 skrll *relptr = 0; 5432 1.1 skrll return section->reloc_count; 5433 1.1 skrll } 5434 1.12 christos 5435 1.12 christos #ifndef coff_finalize_section_relocs 5436 1.6 christos #define coff_finalize_section_relocs _bfd_generic_finalize_section_relocs 5437 1.6 christos #endif 5438 1.1 skrll 5439 1.1 skrll #ifndef coff_reloc16_estimate 5440 1.1 skrll #define coff_reloc16_estimate dummy_reloc16_estimate 5441 1.1 skrll 5442 1.1 skrll static int 5443 1.1 skrll dummy_reloc16_estimate (bfd *abfd ATTRIBUTE_UNUSED, 5444 1.1 skrll asection *input_section ATTRIBUTE_UNUSED, 5445 1.1 skrll arelent *reloc ATTRIBUTE_UNUSED, 5446 1.1 skrll unsigned int shrink ATTRIBUTE_UNUSED, 5447 1.1 skrll struct bfd_link_info *link_info ATTRIBUTE_UNUSED) 5448 1.1 skrll { 5449 1.1 skrll abort (); 5450 1.1 skrll return 0; 5451 1.1 skrll } 5452 1.1 skrll 5453 1.1 skrll #endif 5454 1.1 skrll 5455 1.1 skrll #ifndef coff_reloc16_extra_cases 5456 1.1 skrll 5457 1.1 skrll #define coff_reloc16_extra_cases dummy_reloc16_extra_cases 5458 1.10 christos 5459 1.1 skrll static bool 5460 1.1 skrll dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED, 5461 1.1 skrll struct bfd_link_info *link_info ATTRIBUTE_UNUSED, 5462 1.1 skrll struct bfd_link_order *link_order ATTRIBUTE_UNUSED, 5463 1.1 skrll arelent *reloc ATTRIBUTE_UNUSED, 5464 1.10 christos bfd_byte *data ATTRIBUTE_UNUSED, 5465 1.10 christos size_t *src_ptr ATTRIBUTE_UNUSED, 5466 1.1 skrll size_t *dst_ptr ATTRIBUTE_UNUSED) 5467 1.10 christos { 5468 1.1 skrll return false; 5469 1.1 skrll } 5470 1.1 skrll #endif 5471 1.1 skrll 5472 1.1 skrll /* If coff_relocate_section is defined, we can use the optimized COFF 5473 1.1 skrll backend linker. Otherwise we must continue to use the old linker. */ 5474 1.1 skrll 5475 1.1 skrll #ifdef coff_relocate_section 5476 1.1 skrll 5477 1.1 skrll #ifndef coff_bfd_link_hash_table_create 5478 1.1 skrll #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create 5479 1.1 skrll #endif 5480 1.1 skrll #ifndef coff_bfd_link_add_symbols 5481 1.1 skrll #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols 5482 1.1 skrll #endif 5483 1.1 skrll #ifndef coff_bfd_final_link 5484 1.1 skrll #define coff_bfd_final_link _bfd_coff_final_link 5485 1.1 skrll #endif 5486 1.1 skrll 5487 1.1 skrll #else /* ! defined (coff_relocate_section) */ 5488 1.1 skrll 5489 1.1 skrll #define coff_relocate_section NULL 5490 1.1 skrll #ifndef coff_bfd_link_hash_table_create 5491 1.1 skrll #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create 5492 1.1 skrll #endif 5493 1.1 skrll #ifndef coff_bfd_link_add_symbols 5494 1.1 skrll #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols 5495 1.1 skrll #endif 5496 1.1 skrll #define coff_bfd_final_link _bfd_generic_final_link 5497 1.1 skrll 5498 1.1 skrll #endif /* ! defined (coff_relocate_section) */ 5499 1.1 skrll 5500 1.2 matt #define coff_bfd_link_just_syms _bfd_generic_link_just_syms 5501 1.2 matt #define coff_bfd_copy_link_hash_symbol_type \ 5502 1.1 skrll _bfd_generic_copy_link_hash_symbol_type 5503 1.1 skrll #define coff_bfd_link_split_section _bfd_generic_link_split_section 5504 1.5 christos 5505 1.5 christos #define coff_bfd_link_check_relocs _bfd_generic_link_check_relocs 5506 1.1 skrll 5507 1.1 skrll #ifndef coff_start_final_link 5508 1.1 skrll #define coff_start_final_link NULL 5509 1.1 skrll #endif 5510 1.1 skrll 5511 1.1 skrll #ifndef coff_adjust_symndx 5512 1.1 skrll #define coff_adjust_symndx NULL 5513 1.1 skrll #endif 5514 1.1 skrll 5515 1.1 skrll #ifndef coff_link_output_has_begun 5516 1.9 christos 5517 1.1 skrll static bool 5518 1.1 skrll coff_link_output_has_begun (bfd * abfd, 5519 1.1 skrll struct coff_final_link_info * info ATTRIBUTE_UNUSED) 5520 1.1 skrll { 5521 1.1 skrll return abfd->output_has_begun; 5522 1.1 skrll } 5523 1.1 skrll #endif 5524 1.1 skrll 5525 1.1 skrll #ifndef coff_final_link_postscript 5526 1.9 christos 5527 1.1 skrll static bool 5528 1.1 skrll coff_final_link_postscript (bfd * abfd ATTRIBUTE_UNUSED, 5529 1.1 skrll struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED) 5530 1.9 christos { 5531 1.1 skrll return true; 5532 1.1 skrll } 5533 1.1 skrll #endif 5534 1.1 skrll 5535 1.1 skrll #ifndef coff_SWAP_aux_in 5536 1.1 skrll #define coff_SWAP_aux_in coff_swap_aux_in 5537 1.1 skrll #endif 5538 1.1 skrll #ifndef coff_SWAP_sym_in 5539 1.1 skrll #define coff_SWAP_sym_in coff_swap_sym_in 5540 1.1 skrll #endif 5541 1.1 skrll #ifndef coff_SWAP_lineno_in 5542 1.1 skrll #define coff_SWAP_lineno_in coff_swap_lineno_in 5543 1.1 skrll #endif 5544 1.1 skrll #ifndef coff_SWAP_aux_out 5545 1.1 skrll #define coff_SWAP_aux_out coff_swap_aux_out 5546 1.1 skrll #endif 5547 1.1 skrll #ifndef coff_SWAP_sym_out 5548 1.1 skrll #define coff_SWAP_sym_out coff_swap_sym_out 5549 1.1 skrll #endif 5550 1.1 skrll #ifndef coff_SWAP_lineno_out 5551 1.1 skrll #define coff_SWAP_lineno_out coff_swap_lineno_out 5552 1.1 skrll #endif 5553 1.1 skrll #ifndef coff_SWAP_reloc_out 5554 1.1 skrll #define coff_SWAP_reloc_out coff_swap_reloc_out 5555 1.1 skrll #endif 5556 1.1 skrll #ifndef coff_SWAP_filehdr_out 5557 1.1 skrll #define coff_SWAP_filehdr_out coff_swap_filehdr_out 5558 1.1 skrll #endif 5559 1.1 skrll #ifndef coff_SWAP_aouthdr_out 5560 1.1 skrll #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out 5561 1.1 skrll #endif 5562 1.1 skrll #ifndef coff_SWAP_scnhdr_out 5563 1.1 skrll #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out 5564 1.1 skrll #endif 5565 1.1 skrll #ifndef coff_SWAP_reloc_in 5566 1.1 skrll #define coff_SWAP_reloc_in coff_swap_reloc_in 5567 1.1 skrll #endif 5568 1.1 skrll #ifndef coff_SWAP_filehdr_in 5569 1.1 skrll #define coff_SWAP_filehdr_in coff_swap_filehdr_in 5570 1.1 skrll #endif 5571 1.1 skrll #ifndef coff_SWAP_aouthdr_in 5572 1.1 skrll #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in 5573 1.1 skrll #endif 5574 1.1 skrll #ifndef coff_SWAP_scnhdr_in 5575 1.1 skrll #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in 5576 1.1 skrll #endif 5577 1.10 christos 5578 1.10 christos #define COFF_SWAP_TABLE (void *) &bfd_coff_std_swap_table 5579 1.10 christos 5580 1.1 skrll static const bfd_coff_backend_data bfd_coff_std_swap_table ATTRIBUTE_UNUSED = 5581 1.1 skrll { 5582 1.1 skrll coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in, 5583 1.1 skrll coff_SWAP_aux_out, coff_SWAP_sym_out, 5584 1.1 skrll coff_SWAP_lineno_out, coff_SWAP_reloc_out, 5585 1.1 skrll coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out, 5586 1.1 skrll coff_SWAP_scnhdr_out, 5587 1.1 skrll FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN, 5588 1.9 christos #ifdef COFF_LONG_FILENAMES 5589 1.1 skrll true, 5590 1.9 christos #else 5591 1.1 skrll false, 5592 1.2 matt #endif 5593 1.1 skrll COFF_DEFAULT_LONG_SECTION_NAMES, 5594 1.1 skrll COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 5595 1.9 christos #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS 5596 1.1 skrll true, 5597 1.9 christos #else 5598 1.1 skrll false, 5599 1.1 skrll #endif 5600 1.1 skrll #ifdef COFF_DEBUG_STRING_WIDE_PREFIX 5601 1.1 skrll 4, 5602 1.1 skrll #else 5603 1.1 skrll 2, 5604 1.3 christos #endif 5605 1.1 skrll 32768, 5606 1.1 skrll coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, 5607 1.1 skrll coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, 5608 1.1 skrll coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, 5609 1.1 skrll coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, 5610 1.1 skrll coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, 5611 1.1 skrll coff_classify_symbol, coff_compute_section_file_positions, 5612 1.11 christos coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, 5613 1.1 skrll coff_adjust_symndx, 5614 1.1 skrll coff_link_output_has_begun, coff_final_link_postscript, 5615 1.1 skrll bfd_pe_print_pdata 5616 1.1 skrll }; 5617 1.1 skrll 5618 1.1 skrll #ifdef TICOFF 5619 1.1 skrll /* COFF0 differs in file/section header size and relocation entry size. */ 5620 1.10 christos 5621 1.1 skrll static const bfd_coff_backend_data ticoff0_swap_table = 5622 1.1 skrll { 5623 1.1 skrll coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in, 5624 1.9 christos coff_SWAP_aux_out, coff_SWAP_sym_out, 5625 1.1 skrll coff_SWAP_lineno_out, coff_swap_reloc_v0_out, 5626 1.1 skrll coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out, 5627 1.1 skrll coff_SWAP_scnhdr_out, 5628 1.1 skrll FILHSZ_V0, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ_V0, LINESZ, FILNMLEN, 5629 1.9 christos #ifdef COFF_LONG_FILENAMES 5630 1.1 skrll true, 5631 1.9 christos #else 5632 1.1 skrll false, 5633 1.2 matt #endif 5634 1.1 skrll COFF_DEFAULT_LONG_SECTION_NAMES, 5635 1.1 skrll COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 5636 1.9 christos #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS 5637 1.1 skrll true, 5638 1.9 christos #else 5639 1.1 skrll false, 5640 1.1 skrll #endif 5641 1.1 skrll #ifdef COFF_DEBUG_STRING_WIDE_PREFIX 5642 1.1 skrll 4, 5643 1.1 skrll #else 5644 1.1 skrll 2, 5645 1.3 christos #endif 5646 1.1 skrll 32768, 5647 1.9 christos coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, 5648 1.1 skrll coff_swap_reloc_v0_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook, 5649 1.1 skrll coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, 5650 1.1 skrll coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, 5651 1.1 skrll coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, 5652 1.1 skrll coff_classify_symbol, coff_compute_section_file_positions, 5653 1.11 christos coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, 5654 1.1 skrll coff_adjust_symndx, 5655 1.1 skrll coff_link_output_has_begun, coff_final_link_postscript, 5656 1.1 skrll bfd_pe_print_pdata 5657 1.1 skrll }; 5658 1.1 skrll #endif 5659 1.1 skrll 5660 1.1 skrll #ifdef TICOFF 5661 1.1 skrll /* COFF1 differs in section header size. */ 5662 1.10 christos 5663 1.1 skrll static const bfd_coff_backend_data ticoff1_swap_table = 5664 1.1 skrll { 5665 1.1 skrll coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in, 5666 1.1 skrll coff_SWAP_aux_out, coff_SWAP_sym_out, 5667 1.1 skrll coff_SWAP_lineno_out, coff_SWAP_reloc_out, 5668 1.1 skrll coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out, 5669 1.1 skrll coff_SWAP_scnhdr_out, 5670 1.1 skrll FILHSZ, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN, 5671 1.9 christos #ifdef COFF_LONG_FILENAMES 5672 1.1 skrll true, 5673 1.9 christos #else 5674 1.1 skrll false, 5675 1.2 matt #endif 5676 1.1 skrll COFF_DEFAULT_LONG_SECTION_NAMES, 5677 1.1 skrll COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 5678 1.9 christos #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS 5679 1.1 skrll true, 5680 1.9 christos #else 5681 1.1 skrll false, 5682 1.1 skrll #endif 5683 1.1 skrll #ifdef COFF_DEBUG_STRING_WIDE_PREFIX 5684 1.1 skrll 4, 5685 1.1 skrll #else 5686 1.1 skrll 2, 5687 1.3 christos #endif 5688 1.1 skrll 32768, 5689 1.1 skrll coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, 5690 1.1 skrll coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook, 5691 1.1 skrll coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, 5692 1.1 skrll coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, 5693 1.1 skrll coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, 5694 1.1 skrll coff_classify_symbol, coff_compute_section_file_positions, 5695 1.11 christos coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, 5696 1.1 skrll coff_adjust_symndx, 5697 1.1 skrll coff_link_output_has_begun, coff_final_link_postscript, 5698 1.1 skrll bfd_pe_print_pdata /* huh */ 5699 1.1 skrll }; 5700 1.1 skrll #endif 5701 1.3 christos 5702 1.3 christos #ifdef COFF_WITH_PE_BIGOBJ 5703 1.3 christos /* The UID for bigobj files. */ 5704 1.3 christos 5705 1.3 christos static const char header_bigobj_classid[16] = 5706 1.3 christos { 5707 1.3 christos 0xC7, 0xA1, 0xBA, 0xD1, 5708 1.3 christos 0xEE, 0xBA, 5709 1.3 christos 0xa9, 0x4b, 5710 1.3 christos 0xAF, 0x20, 5711 1.3 christos 0xFA, 0xF6, 0x6A, 0xA4, 0xDC, 0xB8 5712 1.3 christos }; 5713 1.3 christos 5714 1.3 christos /* Swap routines. */ 5715 1.3 christos 5716 1.3 christos static void 5717 1.3 christos coff_bigobj_swap_filehdr_in (bfd * abfd, void * src, void * dst) 5718 1.3 christos { 5719 1.3 christos struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_src = 5720 1.3 christos (struct external_ANON_OBJECT_HEADER_BIGOBJ *) src; 5721 1.3 christos struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst; 5722 1.3 christos 5723 1.3 christos filehdr_dst->f_magic = H_GET_16 (abfd, filehdr_src->Machine); 5724 1.3 christos filehdr_dst->f_nscns = H_GET_32 (abfd, filehdr_src->NumberOfSections); 5725 1.3 christos filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->TimeDateStamp); 5726 1.3 christos filehdr_dst->f_symptr = 5727 1.3 christos GET_FILEHDR_SYMPTR (abfd, filehdr_src->PointerToSymbolTable); 5728 1.3 christos filehdr_dst->f_nsyms = H_GET_32 (abfd, filehdr_src->NumberOfSymbols); 5729 1.3 christos filehdr_dst->f_opthdr = 0; 5730 1.3 christos filehdr_dst->f_flags = 0; 5731 1.3 christos 5732 1.3 christos /* Check other magic numbers. */ 5733 1.3 christos if (H_GET_16 (abfd, filehdr_src->Sig1) != IMAGE_FILE_MACHINE_UNKNOWN 5734 1.3 christos || H_GET_16 (abfd, filehdr_src->Sig2) != 0xffff 5735 1.3 christos || H_GET_16 (abfd, filehdr_src->Version) != 2 5736 1.3 christos || memcmp (filehdr_src->ClassID, header_bigobj_classid, 16) != 0) 5737 1.3 christos filehdr_dst->f_opthdr = 0xffff; 5738 1.3 christos 5739 1.3 christos /* Note that CLR metadata are ignored. */ 5740 1.3 christos } 5741 1.3 christos 5742 1.3 christos static unsigned int 5743 1.3 christos coff_bigobj_swap_filehdr_out (bfd *abfd, void * in, void * out) 5744 1.3 christos { 5745 1.3 christos struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in; 5746 1.3 christos struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_out = 5747 1.3 christos (struct external_ANON_OBJECT_HEADER_BIGOBJ *) out; 5748 1.3 christos 5749 1.3 christos memset (filehdr_out, 0, sizeof (*filehdr_out)); 5750 1.3 christos 5751 1.3 christos H_PUT_16 (abfd, IMAGE_FILE_MACHINE_UNKNOWN, filehdr_out->Sig1); 5752 1.3 christos H_PUT_16 (abfd, 0xffff, filehdr_out->Sig2); 5753 1.3 christos H_PUT_16 (abfd, 2, filehdr_out->Version); 5754 1.3 christos memcpy (filehdr_out->ClassID, header_bigobj_classid, 16); 5755 1.3 christos H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->Machine); 5756 1.3 christos H_PUT_32 (abfd, filehdr_in->f_nscns, filehdr_out->NumberOfSections); 5757 1.3 christos H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->TimeDateStamp); 5758 1.3 christos PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, 5759 1.3 christos filehdr_out->PointerToSymbolTable); 5760 1.3 christos H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->NumberOfSymbols); 5761 1.3 christos 5762 1.3 christos return bfd_coff_filhsz (abfd); 5763 1.3 christos } 5764 1.3 christos 5765 1.3 christos static void 5766 1.3 christos coff_bigobj_swap_sym_in (bfd * abfd, void * ext1, void * in1) 5767 1.3 christos { 5768 1.3 christos SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) ext1; 5769 1.3 christos struct internal_syment *in = (struct internal_syment *) in1; 5770 1.3 christos 5771 1.3 christos if (ext->e.e_name[0] == 0) 5772 1.3 christos { 5773 1.3 christos in->_n._n_n._n_zeroes = 0; 5774 1.3 christos in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset); 5775 1.3 christos } 5776 1.3 christos else 5777 1.3 christos { 5778 1.3 christos #if SYMNMLEN != E_SYMNMLEN 5779 1.3 christos #error we need to cope with truncating or extending SYMNMLEN 5780 1.3 christos #else 5781 1.3 christos memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN); 5782 1.3 christos #endif 5783 1.3 christos } 5784 1.3 christos 5785 1.5 christos in->n_value = H_GET_32 (abfd, ext->e_value); 5786 1.3 christos BFD_ASSERT (sizeof (in->n_scnum) >= 4); 5787 1.3 christos in->n_scnum = H_GET_32 (abfd, ext->e_scnum); 5788 1.3 christos in->n_type = H_GET_16 (abfd, ext->e_type); 5789 1.3 christos in->n_sclass = H_GET_8 (abfd, ext->e_sclass); 5790 1.3 christos in->n_numaux = H_GET_8 (abfd, ext->e_numaux); 5791 1.3 christos } 5792 1.3 christos 5793 1.3 christos static unsigned int 5794 1.3 christos coff_bigobj_swap_sym_out (bfd * abfd, void * inp, void * extp) 5795 1.3 christos { 5796 1.3 christos struct internal_syment *in = (struct internal_syment *) inp; 5797 1.3 christos SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) extp; 5798 1.3 christos 5799 1.3 christos if (in->_n._n_name[0] == 0) 5800 1.3 christos { 5801 1.3 christos H_PUT_32 (abfd, 0, ext->e.e.e_zeroes); 5802 1.3 christos H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset); 5803 1.3 christos } 5804 1.3 christos else 5805 1.3 christos { 5806 1.3 christos #if SYMNMLEN != E_SYMNMLEN 5807 1.3 christos #error we need to cope with truncating or extending SYMNMLEN 5808 1.3 christos #else 5809 1.3 christos memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN); 5810 1.3 christos #endif 5811 1.3 christos } 5812 1.3 christos 5813 1.3 christos H_PUT_32 (abfd, in->n_value, ext->e_value); 5814 1.3 christos H_PUT_32 (abfd, in->n_scnum, ext->e_scnum); 5815 1.3 christos 5816 1.3 christos H_PUT_16 (abfd, in->n_type, ext->e_type); 5817 1.3 christos H_PUT_8 (abfd, in->n_sclass, ext->e_sclass); 5818 1.3 christos H_PUT_8 (abfd, in->n_numaux, ext->e_numaux); 5819 1.3 christos 5820 1.3 christos return SYMESZ_BIGOBJ; 5821 1.3 christos } 5822 1.3 christos 5823 1.3 christos static void 5824 1.3 christos coff_bigobj_swap_aux_in (bfd *abfd, 5825 1.3 christos void * ext1, 5826 1.3 christos int type, 5827 1.10 christos int in_class, 5828 1.10 christos int indx ATTRIBUTE_UNUSED, 5829 1.3 christos int numaux ATTRIBUTE_UNUSED, 5830 1.3 christos void * in1) 5831 1.3 christos { 5832 1.3 christos AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) ext1; 5833 1.3 christos union internal_auxent *in = (union internal_auxent *) in1; 5834 1.7 christos 5835 1.7 christos /* Make sure that all fields in the aux structure are 5836 1.7 christos initialised. */ 5837 1.3 christos memset (in, 0, sizeof * in); 5838 1.3 christos switch (in_class) 5839 1.3 christos { 5840 1.10 christos case C_FILE: 5841 1.3 christos memcpy (in->x_file.x_n.x_fname, ext->File.Name, sizeof (ext->File.Name)); 5842 1.3 christos break; 5843 1.3 christos 5844 1.3 christos case C_STAT: 5845 1.3 christos case C_LEAFSTAT: 5846 1.3 christos case C_HIDDEN: 5847 1.3 christos if (type == T_NULL) 5848 1.3 christos { 5849 1.3 christos in->x_scn.x_scnlen = H_GET_32 (abfd, ext->Section.Length); 5850 1.3 christos in->x_scn.x_nreloc = 5851 1.3 christos H_GET_16 (abfd, ext->Section.NumberOfRelocations); 5852 1.3 christos in->x_scn.x_nlinno = 5853 1.3 christos H_GET_16 (abfd, ext->Section.NumberOfLinenumbers); 5854 1.3 christos in->x_scn.x_checksum = H_GET_32 (abfd, ext->Section.Checksum); 5855 1.3 christos in->x_scn.x_associated = H_GET_16 (abfd, ext->Section.Number) 5856 1.3 christos | (H_GET_16 (abfd, ext->Section.HighNumber) << 16); 5857 1.3 christos in->x_scn.x_comdat = H_GET_8 (abfd, ext->Section.Selection); 5858 1.3 christos return; 5859 1.3 christos } 5860 1.3 christos break; 5861 1.3 christos 5862 1.10 christos default: 5863 1.3 christos in->x_sym.x_tagndx.u32 = H_GET_32 (abfd, ext->Sym.WeakDefaultSymIndex); 5864 1.3 christos /* Characteristics is ignored. */ 5865 1.3 christos break; 5866 1.3 christos } 5867 1.3 christos } 5868 1.3 christos 5869 1.3 christos static unsigned int 5870 1.3 christos coff_bigobj_swap_aux_out (bfd * abfd, 5871 1.3 christos void * inp, 5872 1.3 christos int type, 5873 1.3 christos int in_class, 5874 1.3 christos int indx ATTRIBUTE_UNUSED, 5875 1.3 christos int numaux ATTRIBUTE_UNUSED, 5876 1.3 christos void * extp) 5877 1.3 christos { 5878 1.3 christos union internal_auxent * in = (union internal_auxent *) inp; 5879 1.3 christos AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) extp; 5880 1.3 christos 5881 1.3 christos memset (ext, 0, AUXESZ); 5882 1.3 christos 5883 1.3 christos switch (in_class) 5884 1.3 christos { 5885 1.9 christos case C_FILE: 5886 1.3 christos memcpy (ext->File.Name, in->x_file.x_n.x_fname, sizeof (ext->File.Name)); 5887 1.3 christos 5888 1.3 christos return AUXESZ; 5889 1.3 christos 5890 1.3 christos case C_STAT: 5891 1.3 christos case C_LEAFSTAT: 5892 1.3 christos case C_HIDDEN: 5893 1.3 christos if (type == T_NULL) 5894 1.3 christos { 5895 1.3 christos H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->Section.Length); 5896 1.3 christos H_PUT_16 (abfd, in->x_scn.x_nreloc, 5897 1.3 christos ext->Section.NumberOfRelocations); 5898 1.3 christos H_PUT_16 (abfd, in->x_scn.x_nlinno, 5899 1.3 christos ext->Section.NumberOfLinenumbers); 5900 1.3 christos H_PUT_32 (abfd, in->x_scn.x_checksum, ext->Section.Checksum); 5901 1.3 christos H_PUT_16 (abfd, in->x_scn.x_associated & 0xffff, 5902 1.3 christos ext->Section.Number); 5903 1.3 christos H_PUT_16 (abfd, (in->x_scn.x_associated >> 16), 5904 1.3 christos ext->Section.HighNumber); 5905 1.3 christos H_PUT_8 (abfd, in->x_scn.x_comdat, ext->Section.Selection); 5906 1.3 christos return AUXESZ; 5907 1.3 christos } 5908 1.3 christos break; 5909 1.3 christos } 5910 1.10 christos 5911 1.3 christos H_PUT_32 (abfd, in->x_sym.x_tagndx.u32, ext->Sym.WeakDefaultSymIndex); 5912 1.3 christos H_PUT_32 (abfd, 1, ext->Sym.WeakSearchType); 5913 1.3 christos 5914 1.3 christos return AUXESZ; 5915 1.3 christos } 5916 1.10 christos 5917 1.3 christos static const bfd_coff_backend_data bigobj_swap_table = 5918 1.3 christos { 5919 1.3 christos coff_bigobj_swap_aux_in, coff_bigobj_swap_sym_in, coff_SWAP_lineno_in, 5920 1.3 christos coff_bigobj_swap_aux_out, coff_bigobj_swap_sym_out, 5921 1.3 christos coff_SWAP_lineno_out, coff_SWAP_reloc_out, 5922 1.3 christos coff_bigobj_swap_filehdr_out, coff_SWAP_aouthdr_out, 5923 1.3 christos coff_SWAP_scnhdr_out, 5924 1.3 christos FILHSZ_BIGOBJ, AOUTSZ, SCNHSZ, SYMESZ_BIGOBJ, AUXESZ_BIGOBJ, 5925 1.9 christos RELSZ, LINESZ, FILNMLEN_BIGOBJ, 5926 1.3 christos true, 5927 1.3 christos COFF_DEFAULT_LONG_SECTION_NAMES, 5928 1.9 christos COFF_DEFAULT_SECTION_ALIGNMENT_POWER, 5929 1.3 christos false, 5930 1.3 christos 2, 5931 1.3 christos 1U << 31, 5932 1.3 christos coff_bigobj_swap_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, 5933 1.3 christos coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, 5934 1.3 christos coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, 5935 1.3 christos coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, 5936 1.3 christos coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, 5937 1.3 christos coff_classify_symbol, coff_compute_section_file_positions, 5938 1.11 christos coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, 5939 1.3 christos coff_adjust_symndx, 5940 1.3 christos coff_link_output_has_begun, coff_final_link_postscript, 5941 1.3 christos bfd_pe_print_pdata /* huh */ 5942 1.3 christos }; 5943 1.3 christos 5944 1.3 christos #endif /* COFF_WITH_PE_BIGOBJ */ 5945 1.1 skrll 5946 1.10 christos #ifndef coff_close_and_cleanup 5947 1.1 skrll #define coff_close_and_cleanup _bfd_generic_close_and_cleanup 5948 1.1 skrll #endif 5949 1.1 skrll 5950 1.10 christos #ifndef coff_bfd_free_cached_info 5951 1.1 skrll #define coff_bfd_free_cached_info _bfd_coff_free_cached_info 5952 1.1 skrll #endif 5953 1.1 skrll 5954 1.1 skrll #ifndef coff_get_section_contents 5955 1.1 skrll #define coff_get_section_contents _bfd_generic_get_section_contents 5956 1.1 skrll #endif 5957 1.1 skrll 5958 1.1 skrll #ifndef coff_bfd_copy_private_symbol_data 5959 1.1 skrll #define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data 5960 1.1 skrll #endif 5961 1.1 skrll 5962 1.1 skrll #ifndef coff_bfd_copy_private_header_data 5963 1.1 skrll #define coff_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data 5964 1.1 skrll #endif 5965 1.1 skrll 5966 1.1 skrll #ifndef coff_bfd_copy_private_section_data 5967 1.1 skrll #define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data 5968 1.1 skrll #endif 5969 1.1 skrll 5970 1.1 skrll #ifndef coff_bfd_copy_private_bfd_data 5971 1.1 skrll #define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data 5972 1.1 skrll #endif 5973 1.1 skrll 5974 1.1 skrll #ifndef coff_bfd_merge_private_bfd_data 5975 1.1 skrll #define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data 5976 1.1 skrll #endif 5977 1.1 skrll 5978 1.1 skrll #ifndef coff_bfd_set_private_flags 5979 1.1 skrll #define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags 5980 1.1 skrll #endif 5981 1.1 skrll 5982 1.1 skrll #ifndef coff_bfd_print_private_bfd_data 5983 1.1 skrll #define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data 5984 1.1 skrll #endif 5985 1.1 skrll 5986 1.1 skrll #ifndef coff_bfd_is_local_label_name 5987 1.1 skrll #define coff_bfd_is_local_label_name _bfd_coff_is_local_label_name 5988 1.1 skrll #endif 5989 1.1 skrll 5990 1.7 christos #ifndef coff_bfd_is_target_special_symbol 5991 1.1 skrll #define coff_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false 5992 1.1 skrll #endif 5993 1.1 skrll 5994 1.1 skrll #ifndef coff_read_minisymbols 5995 1.1 skrll #define coff_read_minisymbols _bfd_generic_read_minisymbols 5996 1.1 skrll #endif 5997 1.1 skrll 5998 1.1 skrll #ifndef coff_minisymbol_to_symbol 5999 1.1 skrll #define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol 6000 1.1 skrll #endif 6001 1.1 skrll 6002 1.1 skrll /* The reloc lookup routine must be supplied by each individual COFF 6003 1.1 skrll backend. */ 6004 1.1 skrll #ifndef coff_bfd_reloc_type_lookup 6005 1.1 skrll #define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup 6006 1.1 skrll #endif 6007 1.1 skrll #ifndef coff_bfd_reloc_name_lookup 6008 1.1 skrll #define coff_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup 6009 1.1 skrll #endif 6010 1.1 skrll 6011 1.1 skrll #ifndef coff_bfd_get_relocated_section_contents 6012 1.1 skrll #define coff_bfd_get_relocated_section_contents \ 6013 1.1 skrll bfd_generic_get_relocated_section_contents 6014 1.1 skrll #endif 6015 1.1 skrll 6016 1.1 skrll #ifndef coff_bfd_relax_section 6017 1.1 skrll #define coff_bfd_relax_section bfd_generic_relax_section 6018 1.1 skrll #endif 6019 1.1 skrll 6020 1.12 christos #ifndef coff_bfd_gc_sections 6021 1.1 skrll #define coff_bfd_gc_sections _bfd_coff_gc_sections 6022 1.1 skrll #endif 6023 1.2 matt 6024 1.2 matt #ifndef coff_bfd_lookup_section_flags 6025 1.2 matt #define coff_bfd_lookup_section_flags bfd_generic_lookup_section_flags 6026 1.2 matt #endif 6027 1.1 skrll 6028 1.1 skrll #ifndef coff_bfd_is_group_section 6029 1.1 skrll #define coff_bfd_is_group_section bfd_generic_is_group_section 6030 1.1 skrll #endif 6031 1.8 christos 6032 1.12 christos #ifndef coff_bfd_group_name 6033 1.8 christos #define coff_bfd_group_name _bfd_coff_group_name 6034 1.8 christos #endif 6035 1.1 skrll 6036 1.1 skrll #ifndef coff_bfd_discard_group 6037 1.1 skrll #define coff_bfd_discard_group bfd_generic_discard_group 6038 1.1 skrll #endif 6039 1.1 skrll 6040 1.1 skrll #ifndef coff_section_already_linked 6041 1.2 matt #define coff_section_already_linked \ 6042 1.2 matt _bfd_coff_section_already_linked 6043 1.2 matt #endif 6044 1.2 matt 6045 1.2 matt #ifndef coff_bfd_define_common_symbol 6046 1.1 skrll #define coff_bfd_define_common_symbol bfd_generic_define_common_symbol 6047 1.1 skrll #endif 6048 1.7 christos 6049 1.7 christos #ifndef coff_bfd_link_hide_symbol 6050 1.7 christos #define coff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol 6051 1.7 christos #endif 6052 1.6 christos 6053 1.6 christos #ifndef coff_bfd_define_start_stop 6054 1.6 christos #define coff_bfd_define_start_stop bfd_generic_define_start_stop 6055 1.6 christos #endif 6056 1.12 christos 6057 1.12 christos #ifdef COFF_WITH_PE 6058 1.12 christos #define PE_EXTRA_S_FLAGS (SEC_CODE | SEC_DATA | SEC_READONLY | SEC_LINK_ONCE \ 6059 1.12 christos | SEC_LINK_DUPLICATES) 6060 1.12 christos #else 6061 1.12 christos #define PE_EXTRA_S_FLAGS 0 6062 1.12 christos #endif 6063 1.1 skrll 6064 1.1 skrll #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \ 6065 1.1 skrll const bfd_target VAR = \ 6066 1.1 skrll { \ 6067 1.1 skrll NAME , \ 6068 1.1 skrll bfd_target_coff_flavour, \ 6069 1.1 skrll BFD_ENDIAN_BIG, /* Data byte order is big. */ \ 6070 1.1 skrll BFD_ENDIAN_BIG, /* Header byte order is big. */ \ 6071 1.1 skrll /* object flags */ \ 6072 1.1 skrll (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ 6073 1.1 skrll HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ 6074 1.12 christos /* section flags */ \ 6075 1.12 christos (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ 6076 1.1 skrll | PE_EXTRA_S_FLAGS), \ 6077 1.1 skrll UNDER, /* Leading symbol underscore. */ \ 6078 1.1 skrll '/', /* AR_pad_char. */ \ 6079 1.2 matt 15, /* AR_max_namelen. */ \ 6080 1.9 christos 0, /* match priority. */ \ 6081 1.12 christos TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */ \ 6082 1.1 skrll TARGET_MERGE_SECTIONS, \ 6083 1.1 skrll \ 6084 1.1 skrll /* Data conversion functions. */ \ 6085 1.1 skrll bfd_getb64, bfd_getb_signed_64, bfd_putb64, \ 6086 1.1 skrll bfd_getb32, bfd_getb_signed_32, bfd_putb32, \ 6087 1.1 skrll bfd_getb16, bfd_getb_signed_16, bfd_putb16, \ 6088 1.1 skrll \ 6089 1.1 skrll /* Header conversion functions. */ \ 6090 1.1 skrll bfd_getb64, bfd_getb_signed_64, bfd_putb64, \ 6091 1.1 skrll bfd_getb32, bfd_getb_signed_32, bfd_putb32, \ 6092 1.1 skrll bfd_getb16, bfd_getb_signed_16, bfd_putb16, \ 6093 1.7 christos \ 6094 1.7 christos { /* bfd_check_format. */ \ 6095 1.7 christos _bfd_dummy_target, \ 6096 1.7 christos coff_object_p, \ 6097 1.7 christos bfd_generic_archive_p, \ 6098 1.7 christos _bfd_dummy_target \ 6099 1.7 christos }, \ 6100 1.7 christos { /* bfd_set_format. */ \ 6101 1.7 christos _bfd_bool_bfd_false_error, \ 6102 1.7 christos coff_mkobject, \ 6103 1.7 christos _bfd_generic_mkarchive, \ 6104 1.7 christos _bfd_bool_bfd_false_error \ 6105 1.7 christos }, \ 6106 1.7 christos { /* bfd_write_contents. */ \ 6107 1.7 christos _bfd_bool_bfd_false_error, \ 6108 1.7 christos coff_write_object_contents, \ 6109 1.7 christos _bfd_write_archive_contents, \ 6110 1.7 christos _bfd_bool_bfd_false_error \ 6111 1.1 skrll }, \ 6112 1.1 skrll \ 6113 1.1 skrll BFD_JUMP_TABLE_GENERIC (coff), \ 6114 1.1 skrll BFD_JUMP_TABLE_COPY (coff), \ 6115 1.1 skrll BFD_JUMP_TABLE_CORE (_bfd_nocore), \ 6116 1.1 skrll BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \ 6117 1.1 skrll BFD_JUMP_TABLE_SYMBOLS (coff), \ 6118 1.1 skrll BFD_JUMP_TABLE_RELOCS (coff), \ 6119 1.1 skrll BFD_JUMP_TABLE_WRITE (coff), \ 6120 1.1 skrll BFD_JUMP_TABLE_LINK (coff), \ 6121 1.1 skrll BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \ 6122 1.1 skrll \ 6123 1.1 skrll ALTERNATIVE, \ 6124 1.1 skrll \ 6125 1.1 skrll SWAP_TABLE \ 6126 1.1 skrll }; 6127 1.1 skrll 6128 1.1 skrll #define CREATE_BIGHDR_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \ 6129 1.1 skrll const bfd_target VAR = \ 6130 1.1 skrll { \ 6131 1.1 skrll NAME , \ 6132 1.1 skrll bfd_target_coff_flavour, \ 6133 1.1 skrll BFD_ENDIAN_LITTLE, /* Data byte order is little. */ \ 6134 1.1 skrll BFD_ENDIAN_BIG, /* Header byte order is big. */ \ 6135 1.1 skrll /* object flags */ \ 6136 1.1 skrll (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ 6137 1.1 skrll HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ 6138 1.12 christos /* section flags */ \ 6139 1.12 christos (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ 6140 1.1 skrll | PE_EXTRA_S_FLAGS), \ 6141 1.1 skrll UNDER, /* Leading symbol underscore. */ \ 6142 1.1 skrll '/', /* AR_pad_char. */ \ 6143 1.2 matt 15, /* AR_max_namelen. */ \ 6144 1.9 christos 0, /* match priority. */ \ 6145 1.12 christos TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */ \ 6146 1.1 skrll TARGET_MERGE_SECTIONS, \ 6147 1.1 skrll \ 6148 1.12 christos /* Data conversion functions. */ \ 6149 1.12 christos bfd_getl64, bfd_getl_signed_64, bfd_putl64, \ 6150 1.12 christos bfd_getl32, bfd_getl_signed_32, bfd_putl32, \ 6151 1.1 skrll bfd_getl16, bfd_getl_signed_16, bfd_putl16, \ 6152 1.1 skrll \ 6153 1.1 skrll /* Header conversion functions. */ \ 6154 1.1 skrll bfd_getb64, bfd_getb_signed_64, bfd_putb64, \ 6155 1.1 skrll bfd_getb32, bfd_getb_signed_32, bfd_putb32, \ 6156 1.1 skrll bfd_getb16, bfd_getb_signed_16, bfd_putb16, \ 6157 1.7 christos \ 6158 1.7 christos { /* bfd_check_format. */ \ 6159 1.7 christos _bfd_dummy_target, \ 6160 1.7 christos coff_object_p, \ 6161 1.7 christos bfd_generic_archive_p, \ 6162 1.7 christos _bfd_dummy_target \ 6163 1.7 christos }, \ 6164 1.7 christos { /* bfd_set_format. */ \ 6165 1.7 christos _bfd_bool_bfd_false_error, \ 6166 1.7 christos coff_mkobject, \ 6167 1.7 christos _bfd_generic_mkarchive, \ 6168 1.7 christos _bfd_bool_bfd_false_error \ 6169 1.7 christos }, \ 6170 1.7 christos { /* bfd_write_contents. */ \ 6171 1.7 christos _bfd_bool_bfd_false_error, \ 6172 1.7 christos coff_write_object_contents, \ 6173 1.7 christos _bfd_write_archive_contents, \ 6174 1.7 christos _bfd_bool_bfd_false_error \ 6175 1.1 skrll }, \ 6176 1.1 skrll \ 6177 1.1 skrll BFD_JUMP_TABLE_GENERIC (coff), \ 6178 1.1 skrll BFD_JUMP_TABLE_COPY (coff), \ 6179 1.1 skrll BFD_JUMP_TABLE_CORE (_bfd_nocore), \ 6180 1.1 skrll BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \ 6181 1.1 skrll BFD_JUMP_TABLE_SYMBOLS (coff), \ 6182 1.1 skrll BFD_JUMP_TABLE_RELOCS (coff), \ 6183 1.1 skrll BFD_JUMP_TABLE_WRITE (coff), \ 6184 1.1 skrll BFD_JUMP_TABLE_LINK (coff), \ 6185 1.1 skrll BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \ 6186 1.1 skrll \ 6187 1.1 skrll ALTERNATIVE, \ 6188 1.1 skrll \ 6189 1.1 skrll SWAP_TABLE \ 6190 1.1 skrll }; 6191 1.1 skrll 6192 1.1 skrll #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \ 6193 1.1 skrll const bfd_target VAR = \ 6194 1.1 skrll { \ 6195 1.1 skrll NAME , \ 6196 1.1 skrll bfd_target_coff_flavour, \ 6197 1.1 skrll BFD_ENDIAN_LITTLE, /* Data byte order is little. */ \ 6198 1.1 skrll BFD_ENDIAN_LITTLE, /* Header byte order is little. */ \ 6199 1.1 skrll /* object flags */ \ 6200 1.1 skrll (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ 6201 1.1 skrll HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ 6202 1.12 christos /* section flags */ \ 6203 1.12 christos (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ 6204 1.1 skrll | PE_EXTRA_S_FLAGS), \ 6205 1.1 skrll UNDER, /* Leading symbol underscore. */ \ 6206 1.1 skrll '/', /* AR_pad_char. */ \ 6207 1.2 matt 15, /* AR_max_namelen. */ \ 6208 1.9 christos 0, /* match priority. */ \ 6209 1.12 christos TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */ \ 6210 1.1 skrll TARGET_MERGE_SECTIONS, \ 6211 1.1 skrll \ 6212 1.1 skrll /* Data conversion functions. */ \ 6213 1.1 skrll bfd_getl64, bfd_getl_signed_64, bfd_putl64, \ 6214 1.1 skrll bfd_getl32, bfd_getl_signed_32, bfd_putl32, \ 6215 1.1 skrll bfd_getl16, bfd_getl_signed_16, bfd_putl16, \ 6216 1.1 skrll /* Header conversion functions. */ \ 6217 1.1 skrll bfd_getl64, bfd_getl_signed_64, bfd_putl64, \ 6218 1.1 skrll bfd_getl32, bfd_getl_signed_32, bfd_putl32, \ 6219 1.7 christos bfd_getl16, bfd_getl_signed_16, bfd_putl16, \ 6220 1.7 christos \ 6221 1.7 christos { /* bfd_check_format. */ \ 6222 1.7 christos _bfd_dummy_target, \ 6223 1.7 christos coff_object_p, \ 6224 1.7 christos bfd_generic_archive_p, \ 6225 1.7 christos _bfd_dummy_target \ 6226 1.7 christos }, \ 6227 1.7 christos { /* bfd_set_format. */ \ 6228 1.7 christos _bfd_bool_bfd_false_error, \ 6229 1.7 christos coff_mkobject, \ 6230 1.7 christos _bfd_generic_mkarchive, \ 6231 1.7 christos _bfd_bool_bfd_false_error \ 6232 1.7 christos }, \ 6233 1.7 christos { /* bfd_write_contents. */ \ 6234 1.7 christos _bfd_bool_bfd_false_error, \ 6235 1.7 christos coff_write_object_contents, \ 6236 1.7 christos _bfd_write_archive_contents, \ 6237 1.7 christos _bfd_bool_bfd_false_error \ 6238 1.1 skrll }, \ 6239 1.1 skrll \ 6240 1.1 skrll BFD_JUMP_TABLE_GENERIC (coff), \ 6241 1.1 skrll BFD_JUMP_TABLE_COPY (coff), \ 6242 1.1 skrll BFD_JUMP_TABLE_CORE (_bfd_nocore), \ 6243 1.1 skrll BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \ 6244 1.1 skrll BFD_JUMP_TABLE_SYMBOLS (coff), \ 6245 1.1 skrll BFD_JUMP_TABLE_RELOCS (coff), \ 6246 1.1 skrll BFD_JUMP_TABLE_WRITE (coff), \ 6247 1.1 skrll BFD_JUMP_TABLE_LINK (coff), \ 6248 1.1 skrll BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \ 6249 1.1 skrll \ 6250 1.1 skrll ALTERNATIVE, \ 6251 1.1 skrll \ 6252 1.1 skrll SWAP_TABLE \ 6253 }; 6254