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