1 /* BFD semi-generic back-end for a.out binaries. 2 Copyright (C) 1990-2016 Free Software Foundation, Inc. 3 Written by Cygnus Support. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 /* 23 SECTION 24 a.out backends 25 26 DESCRIPTION 27 28 BFD supports a number of different flavours of a.out format, 29 though the major differences are only the sizes of the 30 structures on disk, and the shape of the relocation 31 information. 32 33 The support is split into a basic support file @file{aoutx.h} 34 and other files which derive functions from the base. One 35 derivation file is @file{aoutf1.h} (for a.out flavour 1), and 36 adds to the basic a.out functions support for sun3, sun4, 386 37 and 29k a.out files, to create a target jump vector for a 38 specific target. 39 40 This information is further split out into more specific files 41 for each machine, including @file{sunos.c} for sun3 and sun4, 42 @file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a 43 demonstration of a 64 bit a.out format. 44 45 The base file @file{aoutx.h} defines general mechanisms for 46 reading and writing records to and from disk and various 47 other methods which BFD requires. It is included by 48 @file{aout32.c} and @file{aout64.c} to form the names 49 <<aout_32_swap_exec_header_in>>, <<aout_64_swap_exec_header_in>>, etc. 50 51 As an example, this is what goes on to make the back end for a 52 sun4, from @file{aout32.c}: 53 54 | #define ARCH_SIZE 32 55 | #include "aoutx.h" 56 57 Which exports names: 58 59 | ... 60 | aout_32_canonicalize_reloc 61 | aout_32_find_nearest_line 62 | aout_32_get_lineno 63 | aout_32_get_reloc_upper_bound 64 | ... 65 66 from @file{sunos.c}: 67 68 | #define TARGET_NAME "a.out-sunos-big" 69 | #define VECNAME sparc_aout_sunos_be_vec 70 | #include "aoutf1.h" 71 72 requires all the names from @file{aout32.c}, and produces the jump vector 73 74 | sparc_aout_sunos_be_vec 75 76 The file @file{host-aout.c} is a special case. It is for a large set 77 of hosts that use ``more or less standard'' a.out files, and 78 for which cross-debugging is not interesting. It uses the 79 standard 32-bit a.out support routines, but determines the 80 file offsets and addresses of the text, data, and BSS 81 sections, the machine architecture and machine type, and the 82 entry point address, in a host-dependent manner. Once these 83 values have been determined, generic code is used to handle 84 the object file. 85 86 When porting it to run on a new system, you must supply: 87 88 | HOST_PAGE_SIZE 89 | HOST_SEGMENT_SIZE 90 | HOST_MACHINE_ARCH (optional) 91 | HOST_MACHINE_MACHINE (optional) 92 | HOST_TEXT_START_ADDR 93 | HOST_STACK_END_ADDR 94 95 in the file @file{../include/sys/h-@var{XXX}.h} (for your host). These 96 values, plus the structures and macros defined in @file{a.out.h} on 97 your host system, will produce a BFD target that will access 98 ordinary a.out files on your host. To configure a new machine 99 to use @file{host-aout.c}, specify: 100 101 | TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec 102 | TDEPFILES= host-aout.o trad-core.o 103 104 in the @file{config/@var{XXX}.mt} file, and modify @file{configure.ac} 105 to use the 106 @file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your 107 configuration is selected. */ 108 109 /* Some assumptions: 110 * Any BFD with D_PAGED set is ZMAGIC, and vice versa. 111 Doesn't matter what the setting of WP_TEXT is on output, but it'll 112 get set on input. 113 * Any BFD with D_PAGED clear and WP_TEXT set is NMAGIC. 114 * Any BFD with both flags clear is OMAGIC. 115 (Just want to make these explicit, so the conditions tested in this 116 file make sense if you're more familiar with a.out than with BFD.) */ 117 118 #define KEEPIT udata.i 119 120 #include "sysdep.h" 121 #include "bfd.h" 122 #include "safe-ctype.h" 123 #include "bfdlink.h" 124 125 #include "libaout.h" 126 #include "libbfd.h" 127 #include "aout/aout64.h" 128 #include "aout/stab_gnu.h" 129 #include "aout/ar.h" 130 131 /* 132 SUBSECTION 133 Relocations 134 135 DESCRIPTION 136 The file @file{aoutx.h} provides for both the @emph{standard} 137 and @emph{extended} forms of a.out relocation records. 138 139 The standard records contain only an 140 address, a symbol index, and a type field. The extended records 141 (used on 29ks and sparcs) also have a full integer for an 142 addend. */ 143 144 #ifndef CTOR_TABLE_RELOC_HOWTO 145 #define CTOR_TABLE_RELOC_IDX 2 146 #define CTOR_TABLE_RELOC_HOWTO(BFD) \ 147 ((obj_reloc_entry_size (BFD) == RELOC_EXT_SIZE \ 148 ? howto_table_ext : howto_table_std) \ 149 + CTOR_TABLE_RELOC_IDX) 150 #endif 151 152 #ifndef MY_swap_std_reloc_in 153 #define MY_swap_std_reloc_in NAME (aout, swap_std_reloc_in) 154 #endif 155 156 #ifndef MY_swap_ext_reloc_in 157 #define MY_swap_ext_reloc_in NAME (aout, swap_ext_reloc_in) 158 #endif 159 160 #ifndef MY_swap_std_reloc_out 161 #define MY_swap_std_reloc_out NAME (aout, swap_std_reloc_out) 162 #endif 163 164 #ifndef MY_swap_ext_reloc_out 165 #define MY_swap_ext_reloc_out NAME (aout, swap_ext_reloc_out) 166 #endif 167 168 #ifndef MY_final_link_relocate 169 #define MY_final_link_relocate _bfd_final_link_relocate 170 #endif 171 172 #ifndef MY_relocate_contents 173 #define MY_relocate_contents _bfd_relocate_contents 174 #endif 175 176 #define howto_table_ext NAME (aout, ext_howto_table) 177 #define howto_table_std NAME (aout, std_howto_table) 178 179 reloc_howto_type howto_table_ext[] = 180 { 181 /* Type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone. */ 182 HOWTO (RELOC_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, 0, "8", FALSE, 0, 0x000000ff, FALSE), 183 HOWTO (RELOC_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, 0, "16", FALSE, 0, 0x0000ffff, FALSE), 184 HOWTO (RELOC_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 0, "32", FALSE, 0, 0xffffffff, FALSE), 185 HOWTO (RELOC_DISP8, 0, 0, 8, TRUE, 0, complain_overflow_signed, 0, "DISP8", FALSE, 0, 0x000000ff, FALSE), 186 HOWTO (RELOC_DISP16, 0, 1, 16, TRUE, 0, complain_overflow_signed, 0, "DISP16", FALSE, 0, 0x0000ffff, FALSE), 187 HOWTO (RELOC_DISP32, 0, 2, 32, TRUE, 0, complain_overflow_signed, 0, "DISP32", FALSE, 0, 0xffffffff, FALSE), 188 HOWTO (RELOC_WDISP30, 2, 2, 30, TRUE, 0, complain_overflow_signed, 0, "WDISP30", FALSE, 0, 0x3fffffff, FALSE), 189 HOWTO (RELOC_WDISP22, 2, 2, 22, TRUE, 0, complain_overflow_signed, 0, "WDISP22", FALSE, 0, 0x003fffff, FALSE), 190 HOWTO (RELOC_HI22, 10, 2, 22, FALSE, 0, complain_overflow_bitfield, 0, "HI22", FALSE, 0, 0x003fffff, FALSE), 191 HOWTO (RELOC_22, 0, 2, 22, FALSE, 0, complain_overflow_bitfield, 0, "22", FALSE, 0, 0x003fffff, FALSE), 192 HOWTO (RELOC_13, 0, 2, 13, FALSE, 0, complain_overflow_bitfield, 0, "13", FALSE, 0, 0x00001fff, FALSE), 193 HOWTO (RELOC_LO10, 0, 2, 10, FALSE, 0, complain_overflow_dont, 0, "LO10", FALSE, 0, 0x000003ff, FALSE), 194 HOWTO (RELOC_SFA_BASE,0, 2, 32, FALSE, 0, complain_overflow_bitfield, 0, "SFA_BASE", FALSE, 0, 0xffffffff, FALSE), 195 HOWTO (RELOC_SFA_OFF13,0, 2, 32, FALSE, 0, complain_overflow_bitfield, 0, "SFA_OFF13", FALSE, 0, 0xffffffff, FALSE), 196 HOWTO (RELOC_BASE10, 0, 2, 10, FALSE, 0, complain_overflow_dont, 0, "BASE10", FALSE, 0, 0x000003ff, FALSE), 197 HOWTO (RELOC_BASE13, 0, 2, 13, FALSE, 0, complain_overflow_signed, 0, "BASE13", FALSE, 0, 0x00001fff, FALSE), 198 HOWTO (RELOC_BASE22, 10, 2, 22, FALSE, 0, complain_overflow_bitfield, 0, "BASE22", FALSE, 0, 0x003fffff, FALSE), 199 HOWTO (RELOC_PC10, 0, 2, 10, TRUE, 0, complain_overflow_dont, 0, "PC10", FALSE, 0, 0x000003ff, TRUE), 200 HOWTO (RELOC_PC22, 10, 2, 22, TRUE, 0, complain_overflow_signed, 0, "PC22", FALSE, 0, 0x003fffff, TRUE), 201 HOWTO (RELOC_JMP_TBL, 2, 2, 30, TRUE, 0, complain_overflow_signed, 0, "JMP_TBL", FALSE, 0, 0x3fffffff, FALSE), 202 HOWTO (RELOC_SEGOFF16,0, 2, 0, FALSE, 0, complain_overflow_bitfield, 0, "SEGOFF16", FALSE, 0, 0x00000000, FALSE), 203 HOWTO (RELOC_GLOB_DAT,0, 2, 0, FALSE, 0, complain_overflow_bitfield, 0, "GLOB_DAT", FALSE, 0, 0x00000000, FALSE), 204 HOWTO (RELOC_JMP_SLOT,0, 2, 0, FALSE, 0, complain_overflow_bitfield, 0, "JMP_SLOT", FALSE, 0, 0x00000000, FALSE), 205 HOWTO (RELOC_RELATIVE,0, 2, 0, FALSE, 0, complain_overflow_bitfield, 0, "RELATIVE", FALSE, 0, 0x00000000, FALSE), 206 HOWTO (0, 0, 3, 0, FALSE, 0, complain_overflow_dont, 0, "R_SPARC_NONE",FALSE, 0, 0x00000000, TRUE), 207 HOWTO (0, 0, 3, 0, FALSE, 0, complain_overflow_dont, 0, "R_SPARC_NONE",FALSE, 0, 0x00000000, TRUE), 208 #define RELOC_SPARC_REV32 RELOC_WDISP19 209 HOWTO (RELOC_SPARC_REV32, 0, 2, 32, FALSE, 0, complain_overflow_dont, 0,"R_SPARC_REV32",FALSE, 0, 0xffffffff, FALSE), 210 }; 211 212 /* Convert standard reloc records to "arelent" format (incl byte swap). */ 213 214 reloc_howto_type howto_table_std[] = 215 { 216 /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone. */ 217 HOWTO ( 0, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,0,"8", TRUE, 0x000000ff,0x000000ff, FALSE), 218 HOWTO ( 1, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,0,"16", TRUE, 0x0000ffff,0x0000ffff, FALSE), 219 HOWTO ( 2, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"32", TRUE, 0xffffffff,0xffffffff, FALSE), 220 HOWTO ( 3, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,0,"64", TRUE, 0xdeaddead,0xdeaddead, FALSE), 221 HOWTO ( 4, 0, 0, 8, TRUE, 0, complain_overflow_signed, 0,"DISP8", TRUE, 0x000000ff,0x000000ff, FALSE), 222 HOWTO ( 5, 0, 1, 16, TRUE, 0, complain_overflow_signed, 0,"DISP16", TRUE, 0x0000ffff,0x0000ffff, FALSE), 223 HOWTO ( 6, 0, 2, 32, TRUE, 0, complain_overflow_signed, 0,"DISP32", TRUE, 0xffffffff,0xffffffff, FALSE), 224 HOWTO ( 7, 0, 4, 64, TRUE, 0, complain_overflow_signed, 0,"DISP64", TRUE, 0xfeedface,0xfeedface, FALSE), 225 HOWTO ( 8, 0, 2, 0, FALSE, 0, complain_overflow_bitfield,0,"GOT_REL", FALSE, 0,0x00000000, FALSE), 226 HOWTO ( 9, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,0,"BASE16", FALSE,0xffffffff,0xffffffff, FALSE), 227 HOWTO (10, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"BASE32", FALSE,0xffffffff,0xffffffff, FALSE), 228 EMPTY_HOWTO (-1), 229 EMPTY_HOWTO (-1), 230 EMPTY_HOWTO (-1), 231 EMPTY_HOWTO (-1), 232 EMPTY_HOWTO (-1), 233 HOWTO (16, 0, 2, 0, FALSE, 0, complain_overflow_bitfield,0,"JMP_TABLE", FALSE, 0,0x00000000, FALSE), 234 EMPTY_HOWTO (-1), 235 EMPTY_HOWTO (-1), 236 EMPTY_HOWTO (-1), 237 EMPTY_HOWTO (-1), 238 EMPTY_HOWTO (-1), 239 EMPTY_HOWTO (-1), 240 EMPTY_HOWTO (-1), 241 EMPTY_HOWTO (-1), 242 EMPTY_HOWTO (-1), 243 EMPTY_HOWTO (-1), 244 EMPTY_HOWTO (-1), 245 EMPTY_HOWTO (-1), 246 EMPTY_HOWTO (-1), 247 EMPTY_HOWTO (-1), 248 EMPTY_HOWTO (-1), 249 HOWTO (32, 0, 2, 0, FALSE, 0, complain_overflow_bitfield,0,"RELATIVE", FALSE, 0,0x00000000, FALSE), 250 EMPTY_HOWTO (-1), 251 EMPTY_HOWTO (-1), 252 EMPTY_HOWTO (-1), 253 EMPTY_HOWTO (-1), 254 EMPTY_HOWTO (-1), 255 EMPTY_HOWTO (-1), 256 EMPTY_HOWTO (-1), 257 HOWTO (40, 0, 2, 0, FALSE, 0, complain_overflow_bitfield,0,"BASEREL", FALSE, 0,0x00000000, FALSE), 258 }; 259 260 #define TABLE_SIZE(TABLE) (sizeof (TABLE) / sizeof (TABLE[0])) 261 262 reloc_howto_type * 263 NAME (aout, reloc_type_lookup) (bfd *abfd, bfd_reloc_code_real_type code) 264 { 265 #define EXT(i, j) case i: return & howto_table_ext [j] 266 #define STD(i, j) case i: return & howto_table_std [j] 267 int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE; 268 269 if (code == BFD_RELOC_CTOR) 270 switch (bfd_arch_bits_per_address (abfd)) 271 { 272 case 32: 273 code = BFD_RELOC_32; 274 break; 275 case 64: 276 code = BFD_RELOC_64; 277 break; 278 } 279 280 if (ext) 281 switch (code) 282 { 283 EXT (BFD_RELOC_8, 0); 284 EXT (BFD_RELOC_16, 1); 285 EXT (BFD_RELOC_32, 2); 286 EXT (BFD_RELOC_HI22, 8); 287 EXT (BFD_RELOC_LO10, 11); 288 EXT (BFD_RELOC_32_PCREL_S2, 6); 289 EXT (BFD_RELOC_SPARC_WDISP22, 7); 290 EXT (BFD_RELOC_SPARC13, 10); 291 EXT (BFD_RELOC_SPARC_GOT10, 14); 292 EXT (BFD_RELOC_SPARC_BASE13, 15); 293 EXT (BFD_RELOC_SPARC_GOT13, 15); 294 EXT (BFD_RELOC_SPARC_GOT22, 16); 295 EXT (BFD_RELOC_SPARC_PC10, 17); 296 EXT (BFD_RELOC_SPARC_PC22, 18); 297 EXT (BFD_RELOC_SPARC_WPLT30, 19); 298 EXT (BFD_RELOC_SPARC_REV32, 26); 299 default: 300 return NULL; 301 } 302 else 303 /* std relocs. */ 304 switch (code) 305 { 306 STD (BFD_RELOC_8, 0); 307 STD (BFD_RELOC_16, 1); 308 STD (BFD_RELOC_32, 2); 309 STD (BFD_RELOC_8_PCREL, 4); 310 STD (BFD_RELOC_16_PCREL, 5); 311 STD (BFD_RELOC_32_PCREL, 6); 312 STD (BFD_RELOC_16_BASEREL, 9); 313 STD (BFD_RELOC_32_BASEREL, 10); 314 default: 315 return NULL; 316 } 317 } 318 319 reloc_howto_type * 320 NAME (aout, reloc_name_lookup) (bfd *abfd, const char *r_name) 321 { 322 unsigned int i, size; 323 reloc_howto_type *howto_table; 324 325 if (obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE) 326 { 327 howto_table = howto_table_ext; 328 size = sizeof (howto_table_ext) / sizeof (howto_table_ext[0]); 329 } 330 else 331 { 332 howto_table = howto_table_std; 333 size = sizeof (howto_table_std) / sizeof (howto_table_std[0]); 334 } 335 336 for (i = 0; i < size; i++) 337 if (howto_table[i].name != NULL 338 && strcasecmp (howto_table[i].name, r_name) == 0) 339 return &howto_table[i]; 340 341 return NULL; 342 } 343 344 /* 345 SUBSECTION 346 Internal entry points 347 348 DESCRIPTION 349 @file{aoutx.h} exports several routines for accessing the 350 contents of an a.out file, which are gathered and exported in 351 turn by various format specific files (eg sunos.c). 352 */ 353 354 /* 355 FUNCTION 356 aout_@var{size}_swap_exec_header_in 357 358 SYNOPSIS 359 void aout_@var{size}_swap_exec_header_in, 360 (bfd *abfd, 361 struct external_exec *bytes, 362 struct internal_exec *execp); 363 364 DESCRIPTION 365 Swap the information in an executable header @var{raw_bytes} taken 366 from a raw byte stream memory image into the internal exec header 367 structure @var{execp}. 368 */ 369 370 #ifndef NAME_swap_exec_header_in 371 void 372 NAME (aout, swap_exec_header_in) (bfd *abfd, 373 struct external_exec *bytes, 374 struct internal_exec *execp) 375 { 376 /* The internal_exec structure has some fields that are unused in this 377 configuration (IE for i960), so ensure that all such uninitialized 378 fields are zero'd out. There are places where two of these structs 379 are memcmp'd, and thus the contents do matter. */ 380 memset ((void *) execp, 0, sizeof (struct internal_exec)); 381 /* Now fill in fields in the execp, from the bytes in the raw data. */ 382 execp->a_info = H_GET_32 (abfd, bytes->e_info); 383 execp->a_text = GET_WORD (abfd, bytes->e_text); 384 execp->a_data = GET_WORD (abfd, bytes->e_data); 385 execp->a_bss = GET_WORD (abfd, bytes->e_bss); 386 execp->a_syms = GET_WORD (abfd, bytes->e_syms); 387 execp->a_entry = GET_WORD (abfd, bytes->e_entry); 388 execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); 389 execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); 390 } 391 #define NAME_swap_exec_header_in NAME (aout, swap_exec_header_in) 392 #endif 393 394 /* 395 FUNCTION 396 aout_@var{size}_swap_exec_header_out 397 398 SYNOPSIS 399 void aout_@var{size}_swap_exec_header_out 400 (bfd *abfd, 401 struct internal_exec *execp, 402 struct external_exec *raw_bytes); 403 404 DESCRIPTION 405 Swap the information in an internal exec header structure 406 @var{execp} into the buffer @var{raw_bytes} ready for writing to disk. 407 */ 408 void 409 NAME (aout, swap_exec_header_out) (bfd *abfd, 410 struct internal_exec *execp, 411 struct external_exec *bytes) 412 { 413 /* Now fill in fields in the raw data, from the fields in the exec struct. */ 414 H_PUT_32 (abfd, execp->a_info , bytes->e_info); 415 PUT_WORD (abfd, execp->a_text , bytes->e_text); 416 PUT_WORD (abfd, execp->a_data , bytes->e_data); 417 PUT_WORD (abfd, execp->a_bss , bytes->e_bss); 418 PUT_WORD (abfd, execp->a_syms , bytes->e_syms); 419 PUT_WORD (abfd, execp->a_entry , bytes->e_entry); 420 PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); 421 PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); 422 } 423 424 /* Make all the section for an a.out file. */ 425 426 bfd_boolean 427 NAME (aout, make_sections) (bfd *abfd) 428 { 429 if (obj_textsec (abfd) == NULL && bfd_make_section (abfd, ".text") == NULL) 430 return FALSE; 431 if (obj_datasec (abfd) == NULL && bfd_make_section (abfd, ".data") == NULL) 432 return FALSE; 433 if (obj_bsssec (abfd) == NULL && bfd_make_section (abfd, ".bss") == NULL) 434 return FALSE; 435 return TRUE; 436 } 437 438 /* 439 FUNCTION 440 aout_@var{size}_some_aout_object_p 441 442 SYNOPSIS 443 const bfd_target *aout_@var{size}_some_aout_object_p 444 (bfd *abfd, 445 struct internal_exec *execp, 446 const bfd_target *(*callback_to_real_object_p) (bfd *)); 447 448 DESCRIPTION 449 Some a.out variant thinks that the file open in @var{abfd} 450 checking is an a.out file. Do some more checking, and set up 451 for access if it really is. Call back to the calling 452 environment's "finish up" function just before returning, to 453 handle any last-minute setup. 454 */ 455 456 const bfd_target * 457 NAME (aout, some_aout_object_p) (bfd *abfd, 458 struct internal_exec *execp, 459 const bfd_target *(*callback_to_real_object_p) (bfd *)) 460 { 461 struct aout_data_struct *rawptr, *oldrawptr; 462 const bfd_target *result; 463 bfd_size_type amt = sizeof (* rawptr); 464 465 rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt); 466 if (rawptr == NULL) 467 return NULL; 468 469 oldrawptr = abfd->tdata.aout_data; 470 abfd->tdata.aout_data = rawptr; 471 472 /* Copy the contents of the old tdata struct. 473 In particular, we want the subformat, since for hpux it was set in 474 hp300hpux.c:swap_exec_header_in and will be used in 475 hp300hpux.c:callback. */ 476 if (oldrawptr != NULL) 477 *abfd->tdata.aout_data = *oldrawptr; 478 479 abfd->tdata.aout_data->a.hdr = &rawptr->e; 480 /* Copy in the internal_exec struct. */ 481 *(abfd->tdata.aout_data->a.hdr) = *execp; 482 execp = abfd->tdata.aout_data->a.hdr; 483 484 /* Set the file flags. */ 485 abfd->flags = BFD_NO_FLAGS; 486 if (execp->a_drsize || execp->a_trsize) 487 abfd->flags |= HAS_RELOC; 488 /* Setting of EXEC_P has been deferred to the bottom of this function. */ 489 if (execp->a_syms) 490 abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; 491 if (N_DYNAMIC (execp)) 492 abfd->flags |= DYNAMIC; 493 494 if (N_MAGIC (execp) == ZMAGIC) 495 { 496 abfd->flags |= D_PAGED | WP_TEXT; 497 adata (abfd).magic = z_magic; 498 } 499 else if (N_MAGIC (execp) == QMAGIC) 500 { 501 abfd->flags |= D_PAGED | WP_TEXT; 502 adata (abfd).magic = z_magic; 503 adata (abfd).subformat = q_magic_format; 504 } 505 else if (N_MAGIC (execp) == NMAGIC) 506 { 507 abfd->flags |= WP_TEXT; 508 adata (abfd).magic = n_magic; 509 } 510 else if (N_MAGIC (execp) == OMAGIC 511 || N_MAGIC (execp) == BMAGIC) 512 adata (abfd).magic = o_magic; 513 else 514 /* Should have been checked with N_BADMAG before this routine 515 was called. */ 516 abort (); 517 518 bfd_get_start_address (abfd) = execp->a_entry; 519 520 obj_aout_symbols (abfd) = NULL; 521 bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist); 522 523 /* The default relocation entry size is that of traditional V7 Unix. */ 524 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; 525 526 /* The default symbol entry size is that of traditional Unix. */ 527 obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE; 528 529 #ifdef USE_MMAP 530 bfd_init_window (&obj_aout_sym_window (abfd)); 531 bfd_init_window (&obj_aout_string_window (abfd)); 532 #endif 533 obj_aout_external_syms (abfd) = NULL; 534 obj_aout_external_strings (abfd) = NULL; 535 obj_aout_sym_hashes (abfd) = NULL; 536 537 if (! NAME (aout, make_sections) (abfd)) 538 goto error_ret; 539 540 obj_datasec (abfd)->size = execp->a_data; 541 obj_bsssec (abfd)->size = execp->a_bss; 542 543 obj_textsec (abfd)->flags = 544 (execp->a_trsize != 0 545 ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC) 546 : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS)); 547 obj_datasec (abfd)->flags = 548 (execp->a_drsize != 0 549 ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC) 550 : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS)); 551 obj_bsssec (abfd)->flags = SEC_ALLOC; 552 553 #ifdef THIS_IS_ONLY_DOCUMENTATION 554 /* The common code can't fill in these things because they depend 555 on either the start address of the text segment, the rounding 556 up of virtual addresses between segments, or the starting file 557 position of the text segment -- all of which varies among different 558 versions of a.out. */ 559 560 /* Call back to the format-dependent code to fill in the rest of the 561 fields and do any further cleanup. Things that should be filled 562 in by the callback: */ 563 564 struct exec *execp = exec_hdr (abfd); 565 566 obj_textsec (abfd)->size = N_TXTSIZE (execp); 567 /* Data and bss are already filled in since they're so standard. */ 568 569 /* The virtual memory addresses of the sections. */ 570 obj_textsec (abfd)->vma = N_TXTADDR (execp); 571 obj_datasec (abfd)->vma = N_DATADDR (execp); 572 obj_bsssec (abfd)->vma = N_BSSADDR (execp); 573 574 /* The file offsets of the sections. */ 575 obj_textsec (abfd)->filepos = N_TXTOFF (execp); 576 obj_datasec (abfd)->filepos = N_DATOFF (execp); 577 578 /* The file offsets of the relocation info. */ 579 obj_textsec (abfd)->rel_filepos = N_TRELOFF (execp); 580 obj_datasec (abfd)->rel_filepos = N_DRELOFF (execp); 581 582 /* The file offsets of the string table and symbol table. */ 583 obj_str_filepos (abfd) = N_STROFF (execp); 584 obj_sym_filepos (abfd) = N_SYMOFF (execp); 585 586 /* Determine the architecture and machine type of the object file. */ 587 switch (N_MACHTYPE (exec_hdr (abfd))) 588 { 589 default: 590 abfd->obj_arch = bfd_arch_obscure; 591 break; 592 } 593 594 adata (abfd)->page_size = TARGET_PAGE_SIZE; 595 adata (abfd)->segment_size = SEGMENT_SIZE; 596 adata (abfd)->exec_bytes_size = EXEC_BYTES_SIZE; 597 598 return abfd->xvec; 599 600 /* The architecture is encoded in various ways in various a.out variants, 601 or is not encoded at all in some of them. The relocation size depends 602 on the architecture and the a.out variant. Finally, the return value 603 is the bfd_target vector in use. If an error occurs, return zero and 604 set bfd_error to the appropriate error code. 605 606 Formats such as b.out, which have additional fields in the a.out 607 header, should cope with them in this callback as well. */ 608 #endif /* DOCUMENTATION */ 609 610 result = (*callback_to_real_object_p) (abfd); 611 612 /* Now that the segment addresses have been worked out, take a better 613 guess at whether the file is executable. If the entry point 614 is within the text segment, assume it is. (This makes files 615 executable even if their entry point address is 0, as long as 616 their text starts at zero.). 617 618 This test had to be changed to deal with systems where the text segment 619 runs at a different location than the default. The problem is that the 620 entry address can appear to be outside the text segment, thus causing an 621 erroneous conclusion that the file isn't executable. 622 623 To fix this, we now accept any non-zero entry point as an indication of 624 executability. This will work most of the time, since only the linker 625 sets the entry point, and that is likely to be non-zero for most systems. */ 626 627 if (execp->a_entry != 0 628 || (execp->a_entry >= obj_textsec (abfd)->vma 629 && execp->a_entry < (obj_textsec (abfd)->vma 630 + obj_textsec (abfd)->size) 631 && execp->a_trsize == 0 632 && execp->a_drsize == 0)) 633 abfd->flags |= EXEC_P; 634 #ifdef STAT_FOR_EXEC 635 else 636 { 637 struct stat stat_buf; 638 639 /* The original heuristic doesn't work in some important cases. 640 The a.out file has no information about the text start 641 address. For files (like kernels) linked to non-standard 642 addresses (ld -Ttext nnn) the entry point may not be between 643 the default text start (obj_textsec(abfd)->vma) and 644 (obj_textsec(abfd)->vma) + text size. This is not just a mach 645 issue. Many kernels are loaded at non standard addresses. */ 646 if (abfd->iostream != NULL 647 && (abfd->flags & BFD_IN_MEMORY) == 0 648 && (fstat (fileno ((FILE *) (abfd->iostream)), &stat_buf) == 0) 649 && ((stat_buf.st_mode & 0111) != 0)) 650 abfd->flags |= EXEC_P; 651 } 652 #endif /* STAT_FOR_EXEC */ 653 654 if (result) 655 return result; 656 657 error_ret: 658 bfd_release (abfd, rawptr); 659 abfd->tdata.aout_data = oldrawptr; 660 return NULL; 661 } 662 663 /* 664 FUNCTION 665 aout_@var{size}_mkobject 666 667 SYNOPSIS 668 bfd_boolean aout_@var{size}_mkobject, (bfd *abfd); 669 670 DESCRIPTION 671 Initialize BFD @var{abfd} for use with a.out files. 672 */ 673 674 bfd_boolean 675 NAME (aout, mkobject) (bfd *abfd) 676 { 677 struct aout_data_struct *rawptr; 678 bfd_size_type amt = sizeof (* rawptr); 679 680 bfd_set_error (bfd_error_system_call); 681 682 rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt); 683 if (rawptr == NULL) 684 return FALSE; 685 686 abfd->tdata.aout_data = rawptr; 687 exec_hdr (abfd) = &(rawptr->e); 688 689 obj_textsec (abfd) = NULL; 690 obj_datasec (abfd) = NULL; 691 obj_bsssec (abfd) = NULL; 692 693 return TRUE; 694 } 695 696 /* 697 FUNCTION 698 aout_@var{size}_machine_type 699 700 SYNOPSIS 701 enum machine_type aout_@var{size}_machine_type 702 (enum bfd_architecture arch, 703 unsigned long machine, 704 bfd_boolean *unknown); 705 706 DESCRIPTION 707 Keep track of machine architecture and machine type for 708 a.out's. Return the <<machine_type>> for a particular 709 architecture and machine, or <<M_UNKNOWN>> if that exact architecture 710 and machine can't be represented in a.out format. 711 712 If the architecture is understood, machine type 0 (default) 713 is always understood. 714 */ 715 716 enum machine_type 717 NAME (aout, machine_type) (enum bfd_architecture arch, 718 unsigned long machine, 719 bfd_boolean *unknown) 720 { 721 enum machine_type arch_flags; 722 723 arch_flags = M_UNKNOWN; 724 *unknown = TRUE; 725 726 switch (arch) 727 { 728 case bfd_arch_sparc: 729 if (machine == 0 730 || machine == bfd_mach_sparc 731 || machine == bfd_mach_sparc_sparclite 732 || machine == bfd_mach_sparc_sparclite_le 733 || machine == bfd_mach_sparc_v8plus 734 || machine == bfd_mach_sparc_v8plusa 735 || machine == bfd_mach_sparc_v8plusb 736 || machine == bfd_mach_sparc_v8plusc 737 || machine == bfd_mach_sparc_v8plusd 738 || machine == bfd_mach_sparc_v8pluse 739 || machine == bfd_mach_sparc_v8plusv 740 || machine == bfd_mach_sparc_v8plusm 741 || machine == bfd_mach_sparc_v9 742 || machine == bfd_mach_sparc_v9a 743 || machine == bfd_mach_sparc_v9b 744 || machine == bfd_mach_sparc_v9c 745 || machine == bfd_mach_sparc_v9d 746 || machine == bfd_mach_sparc_v9e 747 || machine == bfd_mach_sparc_v9v 748 || machine == bfd_mach_sparc_v9m) 749 arch_flags = M_SPARC; 750 else if (machine == bfd_mach_sparc_sparclet) 751 arch_flags = M_SPARCLET; 752 break; 753 754 case bfd_arch_m68k: 755 switch (machine) 756 { 757 case 0: arch_flags = M_68010; break; 758 case bfd_mach_m68000: arch_flags = M_UNKNOWN; *unknown = FALSE; break; 759 case bfd_mach_m68010: arch_flags = M_68010; break; 760 case bfd_mach_m68020: arch_flags = M_68020; break; 761 default: arch_flags = M_UNKNOWN; break; 762 } 763 break; 764 765 case bfd_arch_i386: 766 if (machine == 0 767 || machine == bfd_mach_i386_i386 768 || machine == bfd_mach_i386_i386_intel_syntax) 769 arch_flags = M_386; 770 break; 771 772 case bfd_arch_arm: 773 if (machine == 0) 774 arch_flags = M_ARM; 775 break; 776 777 case bfd_arch_mips: 778 switch (machine) 779 { 780 case 0: 781 case bfd_mach_mips3000: 782 case bfd_mach_mips3900: 783 arch_flags = M_MIPS1; 784 break; 785 case bfd_mach_mips6000: 786 arch_flags = M_MIPS2; 787 break; 788 case bfd_mach_mips4000: 789 case bfd_mach_mips4010: 790 case bfd_mach_mips4100: 791 case bfd_mach_mips4300: 792 case bfd_mach_mips4400: 793 case bfd_mach_mips4600: 794 case bfd_mach_mips4650: 795 case bfd_mach_mips8000: 796 case bfd_mach_mips9000: 797 case bfd_mach_mips10000: 798 case bfd_mach_mips12000: 799 case bfd_mach_mips14000: 800 case bfd_mach_mips16000: 801 case bfd_mach_mips16: 802 case bfd_mach_mipsisa32: 803 case bfd_mach_mipsisa32r2: 804 case bfd_mach_mipsisa32r3: 805 case bfd_mach_mipsisa32r5: 806 case bfd_mach_mipsisa32r6: 807 case bfd_mach_mips5: 808 case bfd_mach_mipsisa64: 809 case bfd_mach_mipsisa64r2: 810 case bfd_mach_mipsisa64r3: 811 case bfd_mach_mipsisa64r5: 812 case bfd_mach_mipsisa64r6: 813 case bfd_mach_mips_sb1: 814 case bfd_mach_mips_xlr: 815 /* FIXME: These should be MIPS3, MIPS4, MIPS16, MIPS32, etc. */ 816 arch_flags = M_MIPS2; 817 break; 818 default: 819 arch_flags = M_UNKNOWN; 820 break; 821 } 822 break; 823 824 case bfd_arch_ns32k: 825 switch (machine) 826 { 827 case 0: arch_flags = M_NS32532; break; 828 case 32032: arch_flags = M_NS32032; break; 829 case 32532: arch_flags = M_NS32532; break; 830 default: arch_flags = M_UNKNOWN; break; 831 } 832 break; 833 834 case bfd_arch_vax: 835 *unknown = FALSE; 836 break; 837 838 case bfd_arch_cris: 839 if (machine == 0 || machine == 255) 840 arch_flags = M_CRIS; 841 break; 842 843 case bfd_arch_m88k: 844 *unknown = FALSE; 845 break; 846 847 default: 848 arch_flags = M_UNKNOWN; 849 } 850 851 if (arch_flags != M_UNKNOWN) 852 *unknown = FALSE; 853 854 return arch_flags; 855 } 856 857 /* 858 FUNCTION 859 aout_@var{size}_set_arch_mach 860 861 SYNOPSIS 862 bfd_boolean aout_@var{size}_set_arch_mach, 863 (bfd *, 864 enum bfd_architecture arch, 865 unsigned long machine); 866 867 DESCRIPTION 868 Set the architecture and the machine of the BFD @var{abfd} to the 869 values @var{arch} and @var{machine}. Verify that @var{abfd}'s format 870 can support the architecture required. 871 */ 872 873 bfd_boolean 874 NAME (aout, set_arch_mach) (bfd *abfd, 875 enum bfd_architecture arch, 876 unsigned long machine) 877 { 878 if (! bfd_default_set_arch_mach (abfd, arch, machine)) 879 return FALSE; 880 881 if (arch != bfd_arch_unknown) 882 { 883 bfd_boolean unknown; 884 885 NAME (aout, machine_type) (arch, machine, &unknown); 886 if (unknown) 887 return FALSE; 888 } 889 890 /* Determine the size of a relocation entry. */ 891 switch (arch) 892 { 893 case bfd_arch_sparc: 894 case bfd_arch_mips: 895 obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; 896 break; 897 default: 898 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; 899 break; 900 } 901 902 return (*aout_backend_info (abfd)->set_sizes) (abfd); 903 } 904 905 static void 906 adjust_o_magic (bfd *abfd, struct internal_exec *execp) 907 { 908 file_ptr pos = adata (abfd).exec_bytes_size; 909 bfd_vma vma = 0; 910 int pad = 0; 911 912 /* Text. */ 913 obj_textsec (abfd)->filepos = pos; 914 if (!obj_textsec (abfd)->user_set_vma) 915 obj_textsec (abfd)->vma = vma; 916 else 917 vma = obj_textsec (abfd)->vma; 918 919 pos += obj_textsec (abfd)->size; 920 vma += obj_textsec (abfd)->size; 921 922 /* Data. */ 923 if (!obj_datasec (abfd)->user_set_vma) 924 { 925 obj_textsec (abfd)->size += pad; 926 pos += pad; 927 vma += pad; 928 obj_datasec (abfd)->vma = vma; 929 } 930 else 931 vma = obj_datasec (abfd)->vma; 932 obj_datasec (abfd)->filepos = pos; 933 pos += obj_datasec (abfd)->size; 934 vma += obj_datasec (abfd)->size; 935 936 /* BSS. */ 937 if (!obj_bsssec (abfd)->user_set_vma) 938 { 939 obj_datasec (abfd)->size += pad; 940 pos += pad; 941 vma += pad; 942 obj_bsssec (abfd)->vma = vma; 943 } 944 else 945 { 946 /* The VMA of the .bss section is set by the VMA of the 947 .data section plus the size of the .data section. We may 948 need to add padding bytes to make this true. */ 949 pad = obj_bsssec (abfd)->vma - vma; 950 if (pad > 0) 951 { 952 obj_datasec (abfd)->size += pad; 953 pos += pad; 954 } 955 } 956 obj_bsssec (abfd)->filepos = pos; 957 958 /* Fix up the exec header. */ 959 execp->a_text = obj_textsec (abfd)->size; 960 execp->a_data = obj_datasec (abfd)->size; 961 execp->a_bss = obj_bsssec (abfd)->size; 962 N_SET_MAGIC (execp, OMAGIC); 963 } 964 965 static void 966 adjust_z_magic (bfd *abfd, struct internal_exec *execp) 967 { 968 bfd_size_type data_pad, text_pad; 969 file_ptr text_end; 970 const struct aout_backend_data *abdp; 971 /* TRUE if text includes exec header. */ 972 bfd_boolean ztih; 973 974 abdp = aout_backend_info (abfd); 975 976 /* Text. */ 977 ztih = (abdp != NULL 978 && (abdp->text_includes_header 979 || obj_aout_subformat (abfd) == q_magic_format)); 980 obj_textsec (abfd)->filepos = (ztih 981 ? adata (abfd).exec_bytes_size 982 : adata (abfd).zmagic_disk_block_size); 983 if (! obj_textsec (abfd)->user_set_vma) 984 { 985 /* ?? Do we really need to check for relocs here? */ 986 obj_textsec (abfd)->vma = ((abfd->flags & HAS_RELOC) 987 ? 0 988 : (ztih 989 ? (abdp->default_text_vma 990 + adata (abfd).exec_bytes_size) 991 : abdp->default_text_vma)); 992 text_pad = 0; 993 } 994 else 995 { 996 /* The .text section is being loaded at an unusual address. We 997 may need to pad it such that the .data section starts at a page 998 boundary. */ 999 if (ztih) 1000 text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma) 1001 & (adata (abfd).page_size - 1)); 1002 else 1003 text_pad = ((- obj_textsec (abfd)->vma) 1004 & (adata (abfd).page_size - 1)); 1005 } 1006 1007 /* Find start of data. */ 1008 if (ztih) 1009 { 1010 text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->size; 1011 text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end; 1012 } 1013 else 1014 { 1015 /* Note that if page_size == zmagic_disk_block_size, then 1016 filepos == page_size, and this case is the same as the ztih 1017 case. */ 1018 text_end = obj_textsec (abfd)->size; 1019 text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end; 1020 text_end += obj_textsec (abfd)->filepos; 1021 } 1022 obj_textsec (abfd)->size += text_pad; 1023 text_end += text_pad; 1024 1025 /* Data. */ 1026 if (!obj_datasec (abfd)->user_set_vma) 1027 { 1028 bfd_vma vma; 1029 vma = obj_textsec (abfd)->vma + obj_textsec (abfd)->size; 1030 obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); 1031 } 1032 if (abdp && abdp->zmagic_mapped_contiguous) 1033 { 1034 asection * text = obj_textsec (abfd); 1035 asection * data = obj_datasec (abfd); 1036 1037 text_pad = data->vma - (text->vma + text->size); 1038 /* Only pad the text section if the data 1039 section is going to be placed after it. */ 1040 if (text_pad > 0) 1041 text->size += text_pad; 1042 } 1043 obj_datasec (abfd)->filepos = (obj_textsec (abfd)->filepos 1044 + obj_textsec (abfd)->size); 1045 1046 /* Fix up exec header while we're at it. */ 1047 execp->a_text = obj_textsec (abfd)->size; 1048 if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted))) 1049 execp->a_text += adata (abfd).exec_bytes_size; 1050 if (obj_aout_subformat (abfd) == q_magic_format) 1051 N_SET_MAGIC (execp, QMAGIC); 1052 else 1053 N_SET_MAGIC (execp, ZMAGIC); 1054 1055 /* Spec says data section should be rounded up to page boundary. */ 1056 obj_datasec (abfd)->size 1057 = align_power (obj_datasec (abfd)->size, 1058 obj_bsssec (abfd)->alignment_power); 1059 execp->a_data = BFD_ALIGN (obj_datasec (abfd)->size, 1060 adata (abfd).page_size); 1061 data_pad = execp->a_data - obj_datasec (abfd)->size; 1062 1063 /* BSS. */ 1064 if (!obj_bsssec (abfd)->user_set_vma) 1065 obj_bsssec (abfd)->vma = (obj_datasec (abfd)->vma 1066 + obj_datasec (abfd)->size); 1067 /* If the BSS immediately follows the data section and extra space 1068 in the page is left after the data section, fudge data 1069 in the header so that the bss section looks smaller by that 1070 amount. We'll start the bss section there, and lie to the OS. 1071 (Note that a linker script, as well as the above assignment, 1072 could have explicitly set the BSS vma to immediately follow 1073 the data section.) */ 1074 if (align_power (obj_bsssec (abfd)->vma, obj_bsssec (abfd)->alignment_power) 1075 == obj_datasec (abfd)->vma + obj_datasec (abfd)->size) 1076 execp->a_bss = (data_pad > obj_bsssec (abfd)->size 1077 ? 0 : obj_bsssec (abfd)->size - data_pad); 1078 else 1079 execp->a_bss = obj_bsssec (abfd)->size; 1080 } 1081 1082 static void 1083 adjust_n_magic (bfd *abfd, struct internal_exec *execp) 1084 { 1085 file_ptr pos = adata (abfd).exec_bytes_size; 1086 bfd_vma vma = 0; 1087 int pad; 1088 1089 /* Text. */ 1090 obj_textsec (abfd)->filepos = pos; 1091 if (!obj_textsec (abfd)->user_set_vma) 1092 obj_textsec (abfd)->vma = vma; 1093 else 1094 vma = obj_textsec (abfd)->vma; 1095 pos += obj_textsec (abfd)->size; 1096 vma += obj_textsec (abfd)->size; 1097 1098 /* Data. */ 1099 obj_datasec (abfd)->filepos = pos; 1100 if (!obj_datasec (abfd)->user_set_vma) 1101 obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); 1102 vma = obj_datasec (abfd)->vma; 1103 1104 /* Since BSS follows data immediately, see if it needs alignment. */ 1105 vma += obj_datasec (abfd)->size; 1106 pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma; 1107 obj_datasec (abfd)->size += pad; 1108 pos += obj_datasec (abfd)->size; 1109 1110 /* BSS. */ 1111 if (!obj_bsssec (abfd)->user_set_vma) 1112 obj_bsssec (abfd)->vma = vma; 1113 else 1114 vma = obj_bsssec (abfd)->vma; 1115 1116 /* Fix up exec header. */ 1117 execp->a_text = obj_textsec (abfd)->size; 1118 execp->a_data = obj_datasec (abfd)->size; 1119 execp->a_bss = obj_bsssec (abfd)->size; 1120 N_SET_MAGIC (execp, NMAGIC); 1121 } 1122 1123 bfd_boolean 1124 NAME (aout, adjust_sizes_and_vmas) (bfd *abfd) 1125 { 1126 struct internal_exec *execp = exec_hdr (abfd); 1127 1128 if (! NAME (aout, make_sections) (abfd)) 1129 return FALSE; 1130 1131 if (adata (abfd).magic != undecided_magic) 1132 return TRUE; 1133 1134 obj_textsec (abfd)->size = 1135 align_power (obj_textsec (abfd)->size, 1136 obj_textsec (abfd)->alignment_power); 1137 1138 /* Rule (heuristic) for when to pad to a new page. Note that there 1139 are (at least) two ways demand-paged (ZMAGIC) files have been 1140 handled. Most Berkeley-based systems start the text segment at 1141 (TARGET_PAGE_SIZE). However, newer versions of SUNOS start the text 1142 segment right after the exec header; the latter is counted in the 1143 text segment size, and is paged in by the kernel with the rest of 1144 the text. */ 1145 1146 /* This perhaps isn't the right way to do this, but made it simpler for me 1147 to understand enough to implement it. Better would probably be to go 1148 right from BFD flags to alignment/positioning characteristics. But the 1149 old code was sloppy enough about handling the flags, and had enough 1150 other magic, that it was a little hard for me to understand. I think 1151 I understand it better now, but I haven't time to do the cleanup this 1152 minute. */ 1153 1154 if (abfd->flags & D_PAGED) 1155 /* Whether or not WP_TEXT is set -- let D_PAGED override. */ 1156 adata (abfd).magic = z_magic; 1157 else if (abfd->flags & WP_TEXT) 1158 adata (abfd).magic = n_magic; 1159 else 1160 adata (abfd).magic = o_magic; 1161 1162 #ifdef BFD_AOUT_DEBUG /* requires gcc2 */ 1163 #if __GNUC__ >= 2 1164 fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n", 1165 ({ char *str; 1166 switch (adata (abfd).magic) 1167 { 1168 case n_magic: str = "NMAGIC"; break; 1169 case o_magic: str = "OMAGIC"; break; 1170 case z_magic: str = "ZMAGIC"; break; 1171 default: abort (); 1172 } 1173 str; 1174 }), 1175 obj_textsec (abfd)->vma, obj_textsec (abfd)->size, 1176 obj_textsec (abfd)->alignment_power, 1177 obj_datasec (abfd)->vma, obj_datasec (abfd)->size, 1178 obj_datasec (abfd)->alignment_power, 1179 obj_bsssec (abfd)->vma, obj_bsssec (abfd)->size, 1180 obj_bsssec (abfd)->alignment_power); 1181 #endif 1182 #endif 1183 1184 switch (adata (abfd).magic) 1185 { 1186 case o_magic: 1187 adjust_o_magic (abfd, execp); 1188 break; 1189 case z_magic: 1190 adjust_z_magic (abfd, execp); 1191 break; 1192 case n_magic: 1193 adjust_n_magic (abfd, execp); 1194 break; 1195 default: 1196 abort (); 1197 } 1198 1199 #ifdef BFD_AOUT_DEBUG 1200 fprintf (stderr, " text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n", 1201 obj_textsec (abfd)->vma, obj_textsec (abfd)->size, 1202 obj_textsec (abfd)->filepos, 1203 obj_datasec (abfd)->vma, obj_datasec (abfd)->size, 1204 obj_datasec (abfd)->filepos, 1205 obj_bsssec (abfd)->vma, obj_bsssec (abfd)->size); 1206 #endif 1207 1208 return TRUE; 1209 } 1210 1211 /* 1212 FUNCTION 1213 aout_@var{size}_new_section_hook 1214 1215 SYNOPSIS 1216 bfd_boolean aout_@var{size}_new_section_hook, 1217 (bfd *abfd, 1218 asection *newsect); 1219 1220 DESCRIPTION 1221 Called by the BFD in response to a @code{bfd_make_section} 1222 request. 1223 */ 1224 bfd_boolean 1225 NAME (aout, new_section_hook) (bfd *abfd, asection *newsect) 1226 { 1227 /* Align to double at least. */ 1228 newsect->alignment_power = bfd_get_arch_info (abfd)->section_align_power; 1229 1230 if (bfd_get_format (abfd) == bfd_object) 1231 { 1232 if (obj_textsec (abfd) == NULL && !strcmp (newsect->name, ".text")) 1233 { 1234 obj_textsec (abfd)= newsect; 1235 newsect->target_index = N_TEXT; 1236 } 1237 else if (obj_datasec (abfd) == NULL && !strcmp (newsect->name, ".data")) 1238 { 1239 obj_datasec (abfd) = newsect; 1240 newsect->target_index = N_DATA; 1241 } 1242 else if (obj_bsssec (abfd) == NULL && !strcmp (newsect->name, ".bss")) 1243 { 1244 obj_bsssec (abfd) = newsect; 1245 newsect->target_index = N_BSS; 1246 } 1247 } 1248 1249 /* We allow more than three sections internally. */ 1250 return _bfd_generic_new_section_hook (abfd, newsect); 1251 } 1252 1253 bfd_boolean 1254 NAME (aout, set_section_contents) (bfd *abfd, 1255 sec_ptr section, 1256 const void * location, 1257 file_ptr offset, 1258 bfd_size_type count) 1259 { 1260 if (! abfd->output_has_begun) 1261 { 1262 if (! NAME (aout, adjust_sizes_and_vmas) (abfd)) 1263 return FALSE; 1264 } 1265 1266 if (section == obj_bsssec (abfd)) 1267 { 1268 bfd_set_error (bfd_error_no_contents); 1269 return FALSE; 1270 } 1271 1272 if (section != obj_textsec (abfd) 1273 && section != obj_datasec (abfd)) 1274 { 1275 if (aout_section_merge_with_text_p (abfd, section)) 1276 section->filepos = obj_textsec (abfd)->filepos + 1277 (section->vma - obj_textsec (abfd)->vma); 1278 else 1279 { 1280 (*_bfd_error_handler) 1281 (_("%s: can not represent section `%s' in a.out object file format"), 1282 bfd_get_filename (abfd), bfd_get_section_name (abfd, section)); 1283 bfd_set_error (bfd_error_nonrepresentable_section); 1284 return FALSE; 1285 } 1286 } 1287 1288 if (count != 0) 1289 { 1290 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0 1291 || bfd_bwrite (location, count, abfd) != count) 1292 return FALSE; 1293 } 1294 1295 return TRUE; 1296 } 1297 1298 /* Read the external symbols from an a.out file. */ 1300 1301 static bfd_boolean 1302 aout_get_external_symbols (bfd *abfd) 1303 { 1304 if (obj_aout_external_syms (abfd) == NULL) 1305 { 1306 bfd_size_type count; 1307 struct external_nlist *syms; 1308 bfd_size_type amt = exec_hdr (abfd)->a_syms; 1309 1310 count = amt / EXTERNAL_NLIST_SIZE; 1311 if (count == 0) 1312 return TRUE; /* Nothing to do. */ 1313 1314 #ifdef USE_MMAP 1315 if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd), amt, 1316 &obj_aout_sym_window (abfd), TRUE)) 1317 return FALSE; 1318 syms = (struct external_nlist *) obj_aout_sym_window (abfd).data; 1319 #else 1320 /* We allocate using malloc to make the values easy to free 1321 later on. If we put them on the objalloc it might not be 1322 possible to free them. */ 1323 syms = (struct external_nlist *) bfd_malloc (amt); 1324 if (syms == NULL) 1325 return FALSE; 1326 1327 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 1328 || bfd_bread (syms, amt, abfd) != amt) 1329 { 1330 free (syms); 1331 return FALSE; 1332 } 1333 #endif 1334 1335 obj_aout_external_syms (abfd) = syms; 1336 obj_aout_external_sym_count (abfd) = count; 1337 } 1338 1339 if (obj_aout_external_strings (abfd) == NULL 1340 && exec_hdr (abfd)->a_syms != 0) 1341 { 1342 unsigned char string_chars[BYTES_IN_WORD]; 1343 bfd_size_type stringsize; 1344 char *strings; 1345 bfd_size_type amt = BYTES_IN_WORD; 1346 1347 /* Get the size of the strings. */ 1348 if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0 1349 || bfd_bread ((void *) string_chars, amt, abfd) != amt) 1350 return FALSE; 1351 stringsize = GET_WORD (abfd, string_chars); 1352 1353 #ifdef USE_MMAP 1354 if (! bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize, 1355 &obj_aout_string_window (abfd), TRUE)) 1356 return FALSE; 1357 strings = (char *) obj_aout_string_window (abfd).data; 1358 #else 1359 strings = (char *) bfd_malloc (stringsize + 1); 1360 if (strings == NULL) 1361 return FALSE; 1362 1363 /* Skip space for the string count in the buffer for convenience 1364 when using indexes. */ 1365 amt = stringsize - BYTES_IN_WORD; 1366 if (bfd_bread (strings + BYTES_IN_WORD, amt, abfd) != amt) 1367 { 1368 free (strings); 1369 return FALSE; 1370 } 1371 #endif 1372 1373 /* Ensure that a zero index yields an empty string. */ 1374 strings[0] = '\0'; 1375 1376 strings[stringsize - 1] = 0; 1377 1378 obj_aout_external_strings (abfd) = strings; 1379 obj_aout_external_string_size (abfd) = stringsize; 1380 } 1381 1382 return TRUE; 1383 } 1384 1385 /* Translate an a.out symbol into a BFD symbol. The desc, other, type 1386 and symbol->value fields of CACHE_PTR will be set from the a.out 1387 nlist structure. This function is responsible for setting 1388 symbol->flags and symbol->section, and adjusting symbol->value. */ 1389 1390 static bfd_boolean 1391 translate_from_native_sym_flags (bfd *abfd, aout_symbol_type *cache_ptr) 1392 { 1393 flagword visible; 1394 1395 if ((cache_ptr->type & N_STAB) != 0 1396 || cache_ptr->type == N_FN) 1397 { 1398 asection *sec; 1399 1400 /* This is a debugging symbol. */ 1401 cache_ptr->symbol.flags = BSF_DEBUGGING; 1402 1403 /* Work out the symbol section. */ 1404 switch (cache_ptr->type & N_TYPE) 1405 { 1406 case N_TEXT: 1407 case N_FN: 1408 sec = obj_textsec (abfd); 1409 break; 1410 case N_DATA: 1411 sec = obj_datasec (abfd); 1412 break; 1413 case N_BSS: 1414 sec = obj_bsssec (abfd); 1415 break; 1416 default: 1417 case N_ABS: 1418 sec = bfd_abs_section_ptr; 1419 break; 1420 } 1421 1422 cache_ptr->symbol.section = sec; 1423 cache_ptr->symbol.value -= sec->vma; 1424 1425 return TRUE; 1426 } 1427 1428 /* Get the default visibility. This does not apply to all types, so 1429 we just hold it in a local variable to use if wanted. */ 1430 if ((cache_ptr->type & N_EXT) == 0) 1431 visible = BSF_LOCAL; 1432 else 1433 visible = BSF_GLOBAL; 1434 1435 switch (cache_ptr->type) 1436 { 1437 default: 1438 case N_ABS: case N_ABS | N_EXT: 1439 cache_ptr->symbol.section = bfd_abs_section_ptr; 1440 cache_ptr->symbol.flags = visible; 1441 break; 1442 1443 case N_UNDF | N_EXT: 1444 if (cache_ptr->symbol.value != 0) 1445 { 1446 /* This is a common symbol. */ 1447 cache_ptr->symbol.flags = BSF_GLOBAL; 1448 cache_ptr->symbol.section = bfd_com_section_ptr; 1449 } 1450 else 1451 { 1452 cache_ptr->symbol.flags = 0; 1453 cache_ptr->symbol.section = bfd_und_section_ptr; 1454 } 1455 break; 1456 1457 case N_TEXT: case N_TEXT | N_EXT: 1458 cache_ptr->symbol.section = obj_textsec (abfd); 1459 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1460 cache_ptr->symbol.flags = visible; 1461 break; 1462 1463 /* N_SETV symbols used to represent set vectors placed in the 1464 data section. They are no longer generated. Theoretically, 1465 it was possible to extract the entries and combine them with 1466 new ones, although I don't know if that was ever actually 1467 done. Unless that feature is restored, treat them as data 1468 symbols. */ 1469 case N_SETV: case N_SETV | N_EXT: 1470 case N_DATA: case N_DATA | N_EXT: 1471 cache_ptr->symbol.section = obj_datasec (abfd); 1472 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1473 cache_ptr->symbol.flags = visible; 1474 break; 1475 1476 case N_BSS: case N_BSS | N_EXT: 1477 cache_ptr->symbol.section = obj_bsssec (abfd); 1478 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1479 cache_ptr->symbol.flags = visible; 1480 break; 1481 1482 case N_SETA: case N_SETA | N_EXT: 1483 case N_SETT: case N_SETT | N_EXT: 1484 case N_SETD: case N_SETD | N_EXT: 1485 case N_SETB: case N_SETB | N_EXT: 1486 { 1487 /* This code is no longer needed. It used to be used to make 1488 the linker handle set symbols, but they are now handled in 1489 the add_symbols routine instead. */ 1490 switch (cache_ptr->type & N_TYPE) 1491 { 1492 case N_SETA: 1493 cache_ptr->symbol.section = bfd_abs_section_ptr; 1494 break; 1495 case N_SETT: 1496 cache_ptr->symbol.section = obj_textsec (abfd); 1497 break; 1498 case N_SETD: 1499 cache_ptr->symbol.section = obj_datasec (abfd); 1500 break; 1501 case N_SETB: 1502 cache_ptr->symbol.section = obj_bsssec (abfd); 1503 break; 1504 } 1505 1506 cache_ptr->symbol.flags |= BSF_CONSTRUCTOR; 1507 } 1508 break; 1509 1510 case N_WARNING: 1511 /* This symbol is the text of a warning message. The next 1512 symbol is the symbol to associate the warning with. If a 1513 reference is made to that symbol, a warning is issued. */ 1514 cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_WARNING; 1515 cache_ptr->symbol.section = bfd_abs_section_ptr; 1516 break; 1517 1518 case N_INDR: case N_INDR | N_EXT: 1519 /* An indirect symbol. This consists of two symbols in a row. 1520 The first symbol is the name of the indirection. The second 1521 symbol is the name of the target. A reference to the first 1522 symbol becomes a reference to the second. */ 1523 cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_INDIRECT | visible; 1524 cache_ptr->symbol.section = bfd_ind_section_ptr; 1525 break; 1526 1527 case N_WEAKU: 1528 cache_ptr->symbol.section = bfd_und_section_ptr; 1529 cache_ptr->symbol.flags = BSF_WEAK; 1530 break; 1531 1532 case N_WEAKA: 1533 cache_ptr->symbol.section = bfd_abs_section_ptr; 1534 cache_ptr->symbol.flags = BSF_WEAK; 1535 break; 1536 1537 case N_WEAKT: 1538 cache_ptr->symbol.section = obj_textsec (abfd); 1539 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1540 cache_ptr->symbol.flags = BSF_WEAK; 1541 break; 1542 1543 case N_WEAKD: 1544 cache_ptr->symbol.section = obj_datasec (abfd); 1545 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1546 cache_ptr->symbol.flags = BSF_WEAK; 1547 break; 1548 1549 case N_WEAKB: 1550 cache_ptr->symbol.section = obj_bsssec (abfd); 1551 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; 1552 cache_ptr->symbol.flags = BSF_WEAK; 1553 break; 1554 } 1555 1556 return TRUE; 1557 } 1558 1559 /* Set the fields of SYM_POINTER according to CACHE_PTR. */ 1560 1561 static bfd_boolean 1562 translate_to_native_sym_flags (bfd *abfd, 1563 asymbol *cache_ptr, 1564 struct external_nlist *sym_pointer) 1565 { 1566 bfd_vma value = cache_ptr->value; 1567 asection *sec; 1568 bfd_vma off; 1569 1570 /* Mask out any existing type bits in case copying from one section 1571 to another. */ 1572 sym_pointer->e_type[0] &= ~N_TYPE; 1573 1574 sec = bfd_get_section (cache_ptr); 1575 off = 0; 1576 1577 if (sec == NULL) 1578 { 1579 /* This case occurs, e.g., for the *DEBUG* section of a COFF 1580 file. */ 1581 (*_bfd_error_handler) 1582 (_("%s: can not represent section for symbol `%s' in a.out object file format"), 1583 bfd_get_filename (abfd), 1584 cache_ptr->name != NULL ? cache_ptr->name : _("*unknown*")); 1585 bfd_set_error (bfd_error_nonrepresentable_section); 1586 return FALSE; 1587 } 1588 1589 if (sec->output_section != NULL) 1590 { 1591 off = sec->output_offset; 1592 sec = sec->output_section; 1593 } 1594 1595 if (bfd_is_abs_section (sec)) 1596 sym_pointer->e_type[0] |= N_ABS; 1597 else if (sec == obj_textsec (abfd)) 1598 sym_pointer->e_type[0] |= N_TEXT; 1599 else if (sec == obj_datasec (abfd)) 1600 sym_pointer->e_type[0] |= N_DATA; 1601 else if (sec == obj_bsssec (abfd)) 1602 sym_pointer->e_type[0] |= N_BSS; 1603 else if (bfd_is_und_section (sec)) 1604 sym_pointer->e_type[0] = N_UNDF | N_EXT; 1605 else if (bfd_is_ind_section (sec)) 1606 sym_pointer->e_type[0] = N_INDR; 1607 else if (bfd_is_com_section (sec)) 1608 sym_pointer->e_type[0] = N_UNDF | N_EXT; 1609 else 1610 { 1611 if (aout_section_merge_with_text_p (abfd, sec)) 1612 sym_pointer->e_type[0] |= N_TEXT; 1613 else 1614 { 1615 (*_bfd_error_handler) 1616 (_("%s: can not represent section `%s' in a.out object file format"), 1617 bfd_get_filename (abfd), bfd_get_section_name (abfd, sec)); 1618 bfd_set_error (bfd_error_nonrepresentable_section); 1619 return FALSE; 1620 } 1621 } 1622 1623 /* Turn the symbol from section relative to absolute again. */ 1624 value += sec->vma + off; 1625 1626 if ((cache_ptr->flags & BSF_WARNING) != 0) 1627 sym_pointer->e_type[0] = N_WARNING; 1628 1629 if ((cache_ptr->flags & BSF_DEBUGGING) != 0) 1630 sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type; 1631 else if ((cache_ptr->flags & BSF_GLOBAL) != 0) 1632 sym_pointer->e_type[0] |= N_EXT; 1633 else if ((cache_ptr->flags & BSF_LOCAL) != 0) 1634 sym_pointer->e_type[0] &= ~N_EXT; 1635 1636 if ((cache_ptr->flags & BSF_CONSTRUCTOR) != 0) 1637 { 1638 int type = ((aout_symbol_type *) cache_ptr)->type; 1639 1640 switch (type) 1641 { 1642 case N_ABS: type = N_SETA; break; 1643 case N_TEXT: type = N_SETT; break; 1644 case N_DATA: type = N_SETD; break; 1645 case N_BSS: type = N_SETB; break; 1646 } 1647 sym_pointer->e_type[0] = type; 1648 } 1649 1650 if ((cache_ptr->flags & BSF_WEAK) != 0) 1651 { 1652 int type; 1653 1654 switch (sym_pointer->e_type[0] & N_TYPE) 1655 { 1656 default: 1657 case N_ABS: type = N_WEAKA; break; 1658 case N_TEXT: type = N_WEAKT; break; 1659 case N_DATA: type = N_WEAKD; break; 1660 case N_BSS: type = N_WEAKB; break; 1661 case N_UNDF: type = N_WEAKU; break; 1662 } 1663 sym_pointer->e_type[0] = type; 1664 } 1665 1666 PUT_WORD (abfd, value, sym_pointer->e_value); 1667 1668 return TRUE; 1669 } 1670 1671 /* Native-level interface to symbols. */ 1673 1674 asymbol * 1675 NAME (aout, make_empty_symbol) (bfd *abfd) 1676 { 1677 bfd_size_type amt = sizeof (aout_symbol_type); 1678 1679 aout_symbol_type *new_symbol = (aout_symbol_type *) bfd_zalloc (abfd, amt); 1680 if (!new_symbol) 1681 return NULL; 1682 new_symbol->symbol.the_bfd = abfd; 1683 1684 return &new_symbol->symbol; 1685 } 1686 1687 /* Translate a set of internal symbols into external symbols. */ 1688 1689 bfd_boolean 1690 NAME (aout, translate_symbol_table) (bfd *abfd, 1691 aout_symbol_type *in, 1692 struct external_nlist *ext, 1693 bfd_size_type count, 1694 char *str, 1695 bfd_size_type strsize, 1696 bfd_boolean dynamic) 1697 { 1698 struct external_nlist *ext_end; 1699 1700 ext_end = ext + count; 1701 for (; ext < ext_end; ext++, in++) 1702 { 1703 bfd_vma x; 1704 1705 x = GET_WORD (abfd, ext->e_strx); 1706 in->symbol.the_bfd = abfd; 1707 1708 /* For the normal symbols, the zero index points at the number 1709 of bytes in the string table but is to be interpreted as the 1710 null string. For the dynamic symbols, the number of bytes in 1711 the string table is stored in the __DYNAMIC structure and the 1712 zero index points at an actual string. */ 1713 if (x == 0 && ! dynamic) 1714 in->symbol.name = ""; 1715 else if (x < strsize) 1716 in->symbol.name = str + x; 1717 else 1718 return FALSE; 1719 1720 in->symbol.value = GET_SWORD (abfd, ext->e_value); 1721 in->desc = H_GET_16 (abfd, ext->e_desc); 1722 in->other = H_GET_8 (abfd, ext->e_other); 1723 in->type = H_GET_8 (abfd, ext->e_type); 1724 in->symbol.udata.p = NULL; 1725 1726 if (! translate_from_native_sym_flags (abfd, in)) 1727 return FALSE; 1728 1729 if (dynamic) 1730 in->symbol.flags |= BSF_DYNAMIC; 1731 } 1732 1733 return TRUE; 1734 } 1735 1736 /* We read the symbols into a buffer, which is discarded when this 1737 function exits. We read the strings into a buffer large enough to 1738 hold them all plus all the cached symbol entries. */ 1739 1740 bfd_boolean 1741 NAME (aout, slurp_symbol_table) (bfd *abfd) 1742 { 1743 struct external_nlist *old_external_syms; 1744 aout_symbol_type *cached; 1745 bfd_size_type cached_size; 1746 1747 /* If there's no work to be done, don't do any. */ 1748 if (obj_aout_symbols (abfd) != NULL) 1749 return TRUE; 1750 1751 old_external_syms = obj_aout_external_syms (abfd); 1752 1753 if (! aout_get_external_symbols (abfd)) 1754 return FALSE; 1755 1756 cached_size = obj_aout_external_sym_count (abfd); 1757 if (cached_size == 0) 1758 return TRUE; /* Nothing to do. */ 1759 1760 cached_size *= sizeof (aout_symbol_type); 1761 cached = (aout_symbol_type *) bfd_zmalloc (cached_size); 1762 if (cached == NULL) 1763 return FALSE; 1764 1765 /* Convert from external symbol information to internal. */ 1766 if (! (NAME (aout, translate_symbol_table) 1767 (abfd, cached, 1768 obj_aout_external_syms (abfd), 1769 obj_aout_external_sym_count (abfd), 1770 obj_aout_external_strings (abfd), 1771 obj_aout_external_string_size (abfd), 1772 FALSE))) 1773 { 1774 free (cached); 1775 return FALSE; 1776 } 1777 1778 bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd); 1779 1780 obj_aout_symbols (abfd) = cached; 1781 1782 /* It is very likely that anybody who calls this function will not 1783 want the external symbol information, so if it was allocated 1784 because of our call to aout_get_external_symbols, we free it up 1785 right away to save space. */ 1786 if (old_external_syms == NULL 1787 && obj_aout_external_syms (abfd) != NULL) 1788 { 1789 #ifdef USE_MMAP 1790 bfd_free_window (&obj_aout_sym_window (abfd)); 1791 #else 1792 free (obj_aout_external_syms (abfd)); 1793 #endif 1794 obj_aout_external_syms (abfd) = NULL; 1795 } 1796 1797 return TRUE; 1798 } 1799 1800 /* We use a hash table when writing out symbols so that we only write 1802 out a particular string once. This helps particularly when the 1803 linker writes out stabs debugging entries, because each different 1804 contributing object file tends to have many duplicate stabs 1805 strings. 1806 1807 This hash table code breaks dbx on SunOS 4.1.3, so we don't do it 1808 if BFD_TRADITIONAL_FORMAT is set. */ 1809 1810 /* Get the index of a string in a strtab, adding it if it is not 1811 already present. */ 1812 1813 static inline bfd_size_type 1814 add_to_stringtab (bfd *abfd, 1815 struct bfd_strtab_hash *tab, 1816 const char *str, 1817 bfd_boolean copy) 1818 { 1819 bfd_boolean hash; 1820 bfd_size_type str_index; 1821 1822 /* An index of 0 always means the empty string. */ 1823 if (str == 0 || *str == '\0') 1824 return 0; 1825 1826 /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx 1827 doesn't understand a hashed string table. */ 1828 hash = TRUE; 1829 if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0) 1830 hash = FALSE; 1831 1832 str_index = _bfd_stringtab_add (tab, str, hash, copy); 1833 1834 if (str_index != (bfd_size_type) -1) 1835 /* Add BYTES_IN_WORD to the return value to account for the 1836 space taken up by the string table size. */ 1837 str_index += BYTES_IN_WORD; 1838 1839 return str_index; 1840 } 1841 1842 /* Write out a strtab. ABFD is already at the right location in the 1843 file. */ 1844 1845 static bfd_boolean 1846 emit_stringtab (bfd *abfd, struct bfd_strtab_hash *tab) 1847 { 1848 bfd_byte buffer[BYTES_IN_WORD]; 1849 bfd_size_type amt = BYTES_IN_WORD; 1850 1851 /* The string table starts with the size. */ 1852 PUT_WORD (abfd, _bfd_stringtab_size (tab) + BYTES_IN_WORD, buffer); 1853 if (bfd_bwrite ((void *) buffer, amt, abfd) != amt) 1854 return FALSE; 1855 1856 return _bfd_stringtab_emit (abfd, tab); 1857 } 1858 1859 bfd_boolean 1861 NAME (aout, write_syms) (bfd *abfd) 1862 { 1863 unsigned int count ; 1864 asymbol **generic = bfd_get_outsymbols (abfd); 1865 struct bfd_strtab_hash *strtab; 1866 1867 strtab = _bfd_stringtab_init (); 1868 if (strtab == NULL) 1869 return FALSE; 1870 1871 for (count = 0; count < bfd_get_symcount (abfd); count++) 1872 { 1873 asymbol *g = generic[count]; 1874 bfd_size_type indx; 1875 struct external_nlist nsp; 1876 bfd_size_type amt; 1877 1878 indx = add_to_stringtab (abfd, strtab, g->name, FALSE); 1879 if (indx == (bfd_size_type) -1) 1880 goto error_return; 1881 PUT_WORD (abfd, indx, (bfd_byte *) nsp.e_strx); 1882 1883 if (bfd_asymbol_flavour (g) == abfd->xvec->flavour) 1884 { 1885 H_PUT_16 (abfd, aout_symbol (g)->desc, nsp.e_desc); 1886 H_PUT_8 (abfd, aout_symbol (g)->other, nsp.e_other); 1887 H_PUT_8 (abfd, aout_symbol (g)->type, nsp.e_type); 1888 } 1889 else 1890 { 1891 H_PUT_16 (abfd, 0, nsp.e_desc); 1892 H_PUT_8 (abfd, 0, nsp.e_other); 1893 H_PUT_8 (abfd, 0, nsp.e_type); 1894 } 1895 1896 if (! translate_to_native_sym_flags (abfd, g, &nsp)) 1897 goto error_return; 1898 1899 amt = EXTERNAL_NLIST_SIZE; 1900 if (bfd_bwrite ((void *) &nsp, amt, abfd) != amt) 1901 goto error_return; 1902 1903 /* NB: `KEEPIT' currently overlays `udata.p', so set this only 1904 here, at the end. */ 1905 g->KEEPIT = count; 1906 } 1907 1908 if (! emit_stringtab (abfd, strtab)) 1909 goto error_return; 1910 1911 _bfd_stringtab_free (strtab); 1912 1913 return TRUE; 1914 1915 error_return: 1916 _bfd_stringtab_free (strtab); 1917 return FALSE; 1918 } 1919 1920 long 1922 NAME (aout, canonicalize_symtab) (bfd *abfd, asymbol **location) 1923 { 1924 unsigned int counter = 0; 1925 aout_symbol_type *symbase; 1926 1927 if (!NAME (aout, slurp_symbol_table) (abfd)) 1928 return -1; 1929 1930 for (symbase = obj_aout_symbols (abfd); 1931 counter++ < bfd_get_symcount (abfd); 1932 ) 1933 *(location++) = (asymbol *) (symbase++); 1934 *location++ =0; 1935 return bfd_get_symcount (abfd); 1936 } 1937 1938 /* Standard reloc stuff. */ 1940 /* Output standard relocation information to a file in target byte order. */ 1941 1942 extern void NAME (aout, swap_std_reloc_out) 1943 (bfd *, arelent *, struct reloc_std_external *); 1944 1945 void 1946 NAME (aout, swap_std_reloc_out) (bfd *abfd, 1947 arelent *g, 1948 struct reloc_std_external *natptr) 1949 { 1950 int r_index; 1951 asymbol *sym = *(g->sym_ptr_ptr); 1952 int r_extern; 1953 unsigned int r_length; 1954 int r_pcrel; 1955 int r_baserel, r_jmptable, r_relative; 1956 asection *output_section = sym->section->output_section; 1957 1958 PUT_WORD (abfd, g->address, natptr->r_address); 1959 1960 r_length = g->howto->size ; /* Size as a power of two. */ 1961 r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ 1962 /* XXX This relies on relocs coming from a.out files. */ 1963 r_baserel = (g->howto->type & 8) != 0; 1964 r_jmptable = (g->howto->type & 16) != 0; 1965 r_relative = (g->howto->type & 32) != 0; 1966 1967 /* Name was clobbered by aout_write_syms to be symbol index. */ 1968 1969 /* If this relocation is relative to a symbol then set the 1970 r_index to the symbols index, and the r_extern bit. 1971 1972 Absolute symbols can come in in two ways, either as an offset 1973 from the abs section, or as a symbol which has an abs value. 1974 check for that here. */ 1975 1976 if (bfd_is_com_section (output_section) 1977 || bfd_is_abs_section (output_section) 1978 || bfd_is_und_section (output_section) 1979 /* PR gas/3041 a.out relocs against weak symbols 1980 must be treated as if they were against externs. */ 1981 || (sym->flags & BSF_WEAK)) 1982 { 1983 if (bfd_abs_section_ptr->symbol == sym) 1984 { 1985 /* Whoops, looked like an abs symbol, but is 1986 really an offset from the abs section. */ 1987 r_index = N_ABS; 1988 r_extern = 0; 1989 } 1990 else 1991 { 1992 /* Fill in symbol. */ 1993 r_extern = 1; 1994 r_index = (*(g->sym_ptr_ptr))->KEEPIT; 1995 } 1996 } 1997 else 1998 { 1999 /* Just an ordinary section. */ 2000 r_extern = 0; 2001 r_index = output_section->target_index; 2002 } 2003 2004 /* Now the fun stuff. */ 2005 if (bfd_header_big_endian (abfd)) 2006 { 2007 natptr->r_index[0] = r_index >> 16; 2008 natptr->r_index[1] = r_index >> 8; 2009 natptr->r_index[2] = r_index; 2010 natptr->r_type[0] = ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) 2011 | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) 2012 | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0) 2013 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0) 2014 | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0) 2015 | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); 2016 } 2017 else 2018 { 2019 natptr->r_index[2] = r_index >> 16; 2020 natptr->r_index[1] = r_index >> 8; 2021 natptr->r_index[0] = r_index; 2022 natptr->r_type[0] = ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) 2023 | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) 2024 | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0) 2025 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0) 2026 | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0) 2027 | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); 2028 } 2029 } 2030 2031 /* Extended stuff. */ 2032 /* Output extended relocation information to a file in target byte order. */ 2033 2034 extern void NAME (aout, swap_ext_reloc_out) 2035 (bfd *, arelent *, struct reloc_ext_external *); 2036 2037 void 2038 NAME (aout, swap_ext_reloc_out) (bfd *abfd, 2039 arelent *g, 2040 struct reloc_ext_external *natptr) 2041 { 2042 int r_index; 2043 int r_extern; 2044 unsigned int r_type; 2045 bfd_vma r_addend; 2046 asymbol *sym = *(g->sym_ptr_ptr); 2047 asection *output_section = sym->section->output_section; 2048 2049 PUT_WORD (abfd, g->address, natptr->r_address); 2050 2051 r_type = (unsigned int) g->howto->type; 2052 2053 r_addend = g->addend; 2054 if ((sym->flags & BSF_SECTION_SYM) != 0) 2055 r_addend += (*(g->sym_ptr_ptr))->section->output_section->vma; 2056 2057 /* If this relocation is relative to a symbol then set the 2058 r_index to the symbols index, and the r_extern bit. 2059 2060 Absolute symbols can come in in two ways, either as an offset 2061 from the abs section, or as a symbol which has an abs value. 2062 check for that here. */ 2063 if (bfd_is_abs_section (bfd_get_section (sym))) 2064 { 2065 r_extern = 0; 2066 r_index = N_ABS; 2067 } 2068 else if ((sym->flags & BSF_SECTION_SYM) == 0) 2069 { 2070 if (bfd_is_und_section (bfd_get_section (sym)) 2071 || (sym->flags & BSF_GLOBAL) != 0) 2072 r_extern = 1; 2073 else 2074 r_extern = 0; 2075 r_index = (*(g->sym_ptr_ptr))->KEEPIT; 2076 } 2077 else 2078 { 2079 /* Just an ordinary section. */ 2080 r_extern = 0; 2081 r_index = output_section->target_index; 2082 } 2083 2084 /* Now the fun stuff. */ 2085 if (bfd_header_big_endian (abfd)) 2086 { 2087 natptr->r_index[0] = r_index >> 16; 2088 natptr->r_index[1] = r_index >> 8; 2089 natptr->r_index[2] = r_index; 2090 natptr->r_type[0] = ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0) 2091 | (r_type << RELOC_EXT_BITS_TYPE_SH_BIG)); 2092 } 2093 else 2094 { 2095 natptr->r_index[2] = r_index >> 16; 2096 natptr->r_index[1] = r_index >> 8; 2097 natptr->r_index[0] = r_index; 2098 natptr->r_type[0] = ((r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0) 2099 | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE)); 2100 } 2101 2102 PUT_WORD (abfd, r_addend, natptr->r_addend); 2103 } 2104 2105 /* BFD deals internally with all things based from the section they're 2106 in. so, something in 10 bytes into a text section with a base of 2107 50 would have a symbol (.text+10) and know .text vma was 50. 2108 2109 Aout keeps all it's symbols based from zero, so the symbol would 2110 contain 60. This macro subs the base of each section from the value 2111 to give the true offset from the section. */ 2112 2113 #define MOVE_ADDRESS(ad) \ 2114 if (r_extern) \ 2115 { \ 2116 /* Undefined symbol. */ \ 2117 cache_ptr->sym_ptr_ptr = symbols + r_index; \ 2118 cache_ptr->addend = ad; \ 2119 } \ 2120 else \ 2121 { \ 2122 /* Defined, section relative. Replace symbol with pointer to \ 2123 symbol which points to section. */ \ 2124 switch (r_index) \ 2125 { \ 2126 case N_TEXT: \ 2127 case N_TEXT | N_EXT: \ 2128 cache_ptr->sym_ptr_ptr = obj_textsec (abfd)->symbol_ptr_ptr; \ 2129 cache_ptr->addend = ad - su->textsec->vma; \ 2130 break; \ 2131 case N_DATA: \ 2132 case N_DATA | N_EXT: \ 2133 cache_ptr->sym_ptr_ptr = obj_datasec (abfd)->symbol_ptr_ptr; \ 2134 cache_ptr->addend = ad - su->datasec->vma; \ 2135 break; \ 2136 case N_BSS: \ 2137 case N_BSS | N_EXT: \ 2138 cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr; \ 2139 cache_ptr->addend = ad - su->bsssec->vma; \ 2140 break; \ 2141 default: \ 2142 case N_ABS: \ 2143 case N_ABS | N_EXT: \ 2144 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \ 2145 cache_ptr->addend = ad; \ 2146 break; \ 2147 } \ 2148 } 2149 2150 void 2151 NAME (aout, swap_ext_reloc_in) (bfd *abfd, 2152 struct reloc_ext_external *bytes, 2153 arelent *cache_ptr, 2154 asymbol **symbols, 2155 bfd_size_type symcount) 2156 { 2157 unsigned int r_index; 2158 int r_extern; 2159 unsigned int r_type; 2160 struct aoutdata *su = &(abfd->tdata.aout_data->a); 2161 2162 cache_ptr->address = (GET_SWORD (abfd, bytes->r_address)); 2163 2164 /* Now the fun stuff. */ 2165 if (bfd_header_big_endian (abfd)) 2166 { 2167 r_index = (((unsigned int) bytes->r_index[0] << 16) 2168 | ((unsigned int) bytes->r_index[1] << 8) 2169 | bytes->r_index[2]); 2170 r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG)); 2171 r_type = ((bytes->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) 2172 >> RELOC_EXT_BITS_TYPE_SH_BIG); 2173 } 2174 else 2175 { 2176 r_index = (((unsigned int) bytes->r_index[2] << 16) 2177 | ((unsigned int) bytes->r_index[1] << 8) 2178 | bytes->r_index[0]); 2179 r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE)); 2180 r_type = ((bytes->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) 2181 >> RELOC_EXT_BITS_TYPE_SH_LITTLE); 2182 } 2183 2184 if (r_type < TABLE_SIZE (howto_table_ext)) 2185 cache_ptr->howto = howto_table_ext + r_type; 2186 else 2187 cache_ptr->howto = NULL; 2188 2189 /* Base relative relocs are always against the symbol table, 2190 regardless of the setting of r_extern. r_extern just reflects 2191 whether the symbol the reloc is against is local or global. */ 2192 if (r_type == (unsigned int) RELOC_BASE10 2193 || r_type == (unsigned int) RELOC_BASE13 2194 || r_type == (unsigned int) RELOC_BASE22) 2195 r_extern = 1; 2196 2197 if (r_extern && r_index > symcount) 2198 { 2199 /* We could arrange to return an error, but it might be useful 2200 to see the file even if it is bad. */ 2201 r_extern = 0; 2202 r_index = N_ABS; 2203 } 2204 2205 MOVE_ADDRESS (GET_SWORD (abfd, bytes->r_addend)); 2206 } 2207 2208 void 2209 NAME (aout, swap_std_reloc_in) (bfd *abfd, 2210 struct reloc_std_external *bytes, 2211 arelent *cache_ptr, 2212 asymbol **symbols, 2213 bfd_size_type symcount) 2214 { 2215 unsigned int r_index; 2216 int r_extern; 2217 unsigned int r_length; 2218 int r_pcrel; 2219 int r_baserel, r_jmptable, r_relative; 2220 struct aoutdata *su = &(abfd->tdata.aout_data->a); 2221 unsigned int howto_idx; 2222 2223 cache_ptr->address = H_GET_32 (abfd, bytes->r_address); 2224 2225 /* Now the fun stuff. */ 2226 if (bfd_header_big_endian (abfd)) 2227 { 2228 r_index = (((unsigned int) bytes->r_index[0] << 16) 2229 | ((unsigned int) bytes->r_index[1] << 8) 2230 | bytes->r_index[2]); 2231 r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); 2232 r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); 2233 r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_BIG)); 2234 r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG)); 2235 r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG)); 2236 r_length = ((bytes->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) 2237 >> RELOC_STD_BITS_LENGTH_SH_BIG); 2238 } 2239 else 2240 { 2241 r_index = (((unsigned int) bytes->r_index[2] << 16) 2242 | ((unsigned int) bytes->r_index[1] << 8) 2243 | bytes->r_index[0]); 2244 r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); 2245 r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); 2246 r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE)); 2247 r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE)); 2248 r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE)); 2249 r_length = ((bytes->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) 2250 >> RELOC_STD_BITS_LENGTH_SH_LITTLE); 2251 } 2252 2253 howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel 2254 + 16 * r_jmptable + 32 * r_relative); 2255 if (howto_idx < TABLE_SIZE (howto_table_std)) 2256 { 2257 cache_ptr->howto = howto_table_std + howto_idx; 2258 if (cache_ptr->howto->type == (unsigned int) -1) 2259 cache_ptr->howto = NULL; 2260 } 2261 else 2262 cache_ptr->howto = NULL; 2263 2264 /* Base relative relocs are always against the symbol table, 2265 regardless of the setting of r_extern. r_extern just reflects 2266 whether the symbol the reloc is against is local or global. */ 2267 if (r_baserel) 2268 r_extern = 1; 2269 2270 if (r_extern && r_index > symcount) 2271 { 2272 /* We could arrange to return an error, but it might be useful 2273 to see the file even if it is bad. */ 2274 r_extern = 0; 2275 r_index = N_ABS; 2276 } 2277 2278 MOVE_ADDRESS (0); 2279 } 2280 2281 /* Read and swap the relocs for a section. */ 2282 2283 bfd_boolean 2284 NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols) 2285 { 2286 bfd_size_type count; 2287 bfd_size_type reloc_size; 2288 void * relocs; 2289 arelent *reloc_cache; 2290 size_t each_size; 2291 unsigned int counter = 0; 2292 arelent *cache_ptr; 2293 bfd_size_type amt; 2294 2295 if (asect->relocation) 2296 return TRUE; 2297 2298 if (asect->flags & SEC_CONSTRUCTOR) 2299 return TRUE; 2300 2301 if (asect == obj_datasec (abfd)) 2302 reloc_size = exec_hdr (abfd)->a_drsize; 2303 else if (asect == obj_textsec (abfd)) 2304 reloc_size = exec_hdr (abfd)->a_trsize; 2305 else if (asect == obj_bsssec (abfd)) 2306 reloc_size = 0; 2307 else 2308 { 2309 bfd_set_error (bfd_error_invalid_operation); 2310 return FALSE; 2311 } 2312 2313 if (reloc_size == 0) 2314 return TRUE; /* Nothing to be done. */ 2315 2316 if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) 2317 return FALSE; 2318 2319 each_size = obj_reloc_entry_size (abfd); 2320 2321 count = reloc_size / each_size; 2322 if (count == 0) 2323 return TRUE; /* Nothing to be done. */ 2324 2325 amt = count * sizeof (arelent); 2326 reloc_cache = (arelent *) bfd_zmalloc (amt); 2327 if (reloc_cache == NULL) 2328 return FALSE; 2329 2330 relocs = bfd_malloc (reloc_size); 2331 if (relocs == NULL) 2332 { 2333 free (reloc_cache); 2334 return FALSE; 2335 } 2336 2337 if (bfd_bread (relocs, reloc_size, abfd) != reloc_size) 2338 { 2339 free (relocs); 2340 free (reloc_cache); 2341 return FALSE; 2342 } 2343 2344 cache_ptr = reloc_cache; 2345 if (each_size == RELOC_EXT_SIZE) 2346 { 2347 struct reloc_ext_external *rptr = (struct reloc_ext_external *) relocs; 2348 2349 for (; counter < count; counter++, rptr++, cache_ptr++) 2350 MY_swap_ext_reloc_in (abfd, rptr, cache_ptr, symbols, 2351 (bfd_size_type) bfd_get_symcount (abfd)); 2352 } 2353 else 2354 { 2355 struct reloc_std_external *rptr = (struct reloc_std_external *) relocs; 2356 2357 for (; counter < count; counter++, rptr++, cache_ptr++) 2358 MY_swap_std_reloc_in (abfd, rptr, cache_ptr, symbols, 2359 (bfd_size_type) bfd_get_symcount (abfd)); 2360 } 2361 2362 free (relocs); 2363 2364 asect->relocation = reloc_cache; 2365 asect->reloc_count = cache_ptr - reloc_cache; 2366 2367 return TRUE; 2368 } 2369 2370 /* Write out a relocation section into an object file. */ 2371 2372 bfd_boolean 2373 NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section) 2374 { 2375 arelent **generic; 2376 unsigned char *native, *natptr; 2377 size_t each_size; 2378 2379 unsigned int count = section->reloc_count; 2380 bfd_size_type natsize; 2381 2382 if (count == 0 || section->orelocation == NULL) 2383 return TRUE; 2384 2385 each_size = obj_reloc_entry_size (abfd); 2386 natsize = (bfd_size_type) each_size * count; 2387 native = (unsigned char *) bfd_zalloc (abfd, natsize); 2388 if (!native) 2389 return FALSE; 2390 2391 generic = section->orelocation; 2392 2393 if (each_size == RELOC_EXT_SIZE) 2394 { 2395 for (natptr = native; 2396 count != 0; 2397 --count, natptr += each_size, ++generic) 2398 MY_swap_ext_reloc_out (abfd, *generic, 2399 (struct reloc_ext_external *) natptr); 2400 } 2401 else 2402 { 2403 for (natptr = native; 2404 count != 0; 2405 --count, natptr += each_size, ++generic) 2406 MY_swap_std_reloc_out (abfd, *generic, 2407 (struct reloc_std_external *) natptr); 2408 } 2409 2410 if (bfd_bwrite ((void *) native, natsize, abfd) != natsize) 2411 { 2412 bfd_release (abfd, native); 2413 return FALSE; 2414 } 2415 bfd_release (abfd, native); 2416 2417 return TRUE; 2418 } 2419 2420 /* This is stupid. This function should be a boolean predicate. */ 2421 2422 long 2423 NAME (aout, canonicalize_reloc) (bfd *abfd, 2424 sec_ptr section, 2425 arelent **relptr, 2426 asymbol **symbols) 2427 { 2428 arelent *tblptr = section->relocation; 2429 unsigned int count; 2430 2431 if (section == obj_bsssec (abfd)) 2432 { 2433 *relptr = NULL; 2434 return 0; 2435 } 2436 2437 if (!(tblptr || NAME (aout, slurp_reloc_table) (abfd, section, symbols))) 2438 return -1; 2439 2440 if (section->flags & SEC_CONSTRUCTOR) 2441 { 2442 arelent_chain *chain = section->constructor_chain; 2443 for (count = 0; count < section->reloc_count; count ++) 2444 { 2445 *relptr ++ = &chain->relent; 2446 chain = chain->next; 2447 } 2448 } 2449 else 2450 { 2451 tblptr = section->relocation; 2452 2453 for (count = 0; count++ < section->reloc_count; ) 2454 { 2455 *relptr++ = tblptr++; 2456 } 2457 } 2458 *relptr = 0; 2459 2460 return section->reloc_count; 2461 } 2462 2463 long 2464 NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect) 2465 { 2466 if (bfd_get_format (abfd) != bfd_object) 2467 { 2468 bfd_set_error (bfd_error_invalid_operation); 2469 return -1; 2470 } 2471 2472 if (asect->flags & SEC_CONSTRUCTOR) 2473 return sizeof (arelent *) * (asect->reloc_count + 1); 2474 2475 if (asect == obj_datasec (abfd)) 2476 return sizeof (arelent *) 2477 * ((exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd)) 2478 + 1); 2479 2480 if (asect == obj_textsec (abfd)) 2481 return sizeof (arelent *) 2482 * ((exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd)) 2483 + 1); 2484 2485 if (asect == obj_bsssec (abfd)) 2486 return sizeof (arelent *); 2487 2488 if (asect == obj_bsssec (abfd)) 2489 return 0; 2490 2491 bfd_set_error (bfd_error_invalid_operation); 2492 return -1; 2493 } 2494 2495 long 2497 NAME (aout, get_symtab_upper_bound) (bfd *abfd) 2498 { 2499 if (!NAME (aout, slurp_symbol_table) (abfd)) 2500 return -1; 2501 2502 return (bfd_get_symcount (abfd)+1) * (sizeof (aout_symbol_type *)); 2503 } 2504 2505 alent * 2506 NAME (aout, get_lineno) (bfd *ignore_abfd ATTRIBUTE_UNUSED, 2507 asymbol *ignore_symbol ATTRIBUTE_UNUSED) 2508 { 2509 return NULL; 2510 } 2511 2512 void 2513 NAME (aout, get_symbol_info) (bfd *ignore_abfd ATTRIBUTE_UNUSED, 2514 asymbol *symbol, 2515 symbol_info *ret) 2516 { 2517 bfd_symbol_info (symbol, ret); 2518 2519 if (ret->type == '?') 2520 { 2521 int type_code = aout_symbol (symbol)->type & 0xff; 2522 const char *stab_name = bfd_get_stab_name (type_code); 2523 static char buf[10]; 2524 2525 if (stab_name == NULL) 2526 { 2527 sprintf (buf, "(%d)", type_code); 2528 stab_name = buf; 2529 } 2530 ret->type = '-'; 2531 ret->stab_type = type_code; 2532 ret->stab_other = (unsigned) (aout_symbol (symbol)->other & 0xff); 2533 ret->stab_desc = (unsigned) (aout_symbol (symbol)->desc & 0xffff); 2534 ret->stab_name = stab_name; 2535 } 2536 } 2537 2538 void 2539 NAME (aout, print_symbol) (bfd *abfd, 2540 void * afile, 2541 asymbol *symbol, 2542 bfd_print_symbol_type how) 2543 { 2544 FILE *file = (FILE *)afile; 2545 2546 switch (how) 2547 { 2548 case bfd_print_symbol_name: 2549 if (symbol->name) 2550 fprintf (file,"%s", symbol->name); 2551 break; 2552 case bfd_print_symbol_more: 2553 fprintf (file,"%4x %2x %2x", 2554 (unsigned) (aout_symbol (symbol)->desc & 0xffff), 2555 (unsigned) (aout_symbol (symbol)->other & 0xff), 2556 (unsigned) (aout_symbol (symbol)->type)); 2557 break; 2558 case bfd_print_symbol_all: 2559 { 2560 const char *section_name = symbol->section->name; 2561 2562 bfd_print_symbol_vandf (abfd, (void *)file, symbol); 2563 2564 fprintf (file," %-5s %04x %02x %02x", 2565 section_name, 2566 (unsigned) (aout_symbol (symbol)->desc & 0xffff), 2567 (unsigned) (aout_symbol (symbol)->other & 0xff), 2568 (unsigned) (aout_symbol (symbol)->type & 0xff)); 2569 if (symbol->name) 2570 fprintf (file," %s", symbol->name); 2571 } 2572 break; 2573 } 2574 } 2575 2576 /* If we don't have to allocate more than 1MB to hold the generic 2577 symbols, we use the generic minisymbol methord: it's faster, since 2578 it only translates the symbols once, not multiple times. */ 2579 #define MINISYM_THRESHOLD (1000000 / sizeof (asymbol)) 2580 2581 /* Read minisymbols. For minisymbols, we use the unmodified a.out 2582 symbols. The minisymbol_to_symbol function translates these into 2583 BFD asymbol structures. */ 2584 2585 long 2586 NAME (aout, read_minisymbols) (bfd *abfd, 2587 bfd_boolean dynamic, 2588 void * *minisymsp, 2589 unsigned int *sizep) 2590 { 2591 if (dynamic) 2592 /* We could handle the dynamic symbols here as well, but it's 2593 easier to hand them off. */ 2594 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep); 2595 2596 if (! aout_get_external_symbols (abfd)) 2597 return -1; 2598 2599 if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD) 2600 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep); 2601 2602 *minisymsp = (void *) obj_aout_external_syms (abfd); 2603 2604 /* By passing the external symbols back from this routine, we are 2605 giving up control over the memory block. Clear 2606 obj_aout_external_syms, so that we do not try to free it 2607 ourselves. */ 2608 obj_aout_external_syms (abfd) = NULL; 2609 2610 *sizep = EXTERNAL_NLIST_SIZE; 2611 return obj_aout_external_sym_count (abfd); 2612 } 2613 2614 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an 2615 unmodified a.out symbol. The SYM argument is a structure returned 2616 by bfd_make_empty_symbol, which we fill in here. */ 2617 2618 asymbol * 2619 NAME (aout, minisymbol_to_symbol) (bfd *abfd, 2620 bfd_boolean dynamic, 2621 const void * minisym, 2622 asymbol *sym) 2623 { 2624 if (dynamic 2625 || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD) 2626 return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym); 2627 2628 memset (sym, 0, sizeof (aout_symbol_type)); 2629 2630 /* We call translate_symbol_table to translate a single symbol. */ 2631 if (! (NAME (aout, translate_symbol_table) 2632 (abfd, 2633 (aout_symbol_type *) sym, 2634 (struct external_nlist *) minisym, 2635 (bfd_size_type) 1, 2636 obj_aout_external_strings (abfd), 2637 obj_aout_external_string_size (abfd), 2638 FALSE))) 2639 return NULL; 2640 2641 return sym; 2642 } 2643 2644 /* Provided a BFD, a section and an offset into the section, calculate 2645 and return the name of the source file and the line nearest to the 2646 wanted location. */ 2647 2648 bfd_boolean 2649 NAME (aout, find_nearest_line) (bfd *abfd, 2650 asymbol **symbols, 2651 asection *section, 2652 bfd_vma offset, 2653 const char **filename_ptr, 2654 const char **functionname_ptr, 2655 unsigned int *line_ptr, 2656 unsigned int *disriminator_ptr) 2657 { 2658 /* Run down the file looking for the filename, function and linenumber. */ 2659 asymbol **p; 2660 const char *directory_name = NULL; 2661 const char *main_file_name = NULL; 2662 const char *current_file_name = NULL; 2663 const char *line_file_name = NULL; /* Value of current_file_name at line number. */ 2664 const char *line_directory_name = NULL; /* Value of directory_name at line number. */ 2665 bfd_vma low_line_vma = 0; 2666 bfd_vma low_func_vma = 0; 2667 asymbol *func = 0; 2668 bfd_size_type filelen, funclen; 2669 char *buf; 2670 2671 *filename_ptr = abfd->filename; 2672 *functionname_ptr = 0; 2673 *line_ptr = 0; 2674 if (disriminator_ptr) 2675 *disriminator_ptr = 0; 2676 2677 if (symbols != NULL) 2678 { 2679 for (p = symbols; *p; p++) 2680 { 2681 aout_symbol_type *q = (aout_symbol_type *) (*p); 2682 next: 2683 switch (q->type) 2684 { 2685 case N_TEXT: 2686 /* If this looks like a file name symbol, and it comes after 2687 the line number we have found so far, but before the 2688 offset, then we have probably not found the right line 2689 number. */ 2690 if (q->symbol.value <= offset 2691 && ((q->symbol.value > low_line_vma 2692 && (line_file_name != NULL 2693 || *line_ptr != 0)) 2694 || (q->symbol.value > low_func_vma 2695 && func != NULL))) 2696 { 2697 const char *symname; 2698 2699 symname = q->symbol.name; 2700 if (strcmp (symname + strlen (symname) - 2, ".o") == 0) 2701 { 2702 if (q->symbol.value > low_line_vma) 2703 { 2704 *line_ptr = 0; 2705 line_file_name = NULL; 2706 } 2707 if (q->symbol.value > low_func_vma) 2708 func = NULL; 2709 } 2710 } 2711 break; 2712 2713 case N_SO: 2714 /* If this symbol is less than the offset, but greater than 2715 the line number we have found so far, then we have not 2716 found the right line number. */ 2717 if (q->symbol.value <= offset) 2718 { 2719 if (q->symbol.value > low_line_vma) 2720 { 2721 *line_ptr = 0; 2722 line_file_name = NULL; 2723 } 2724 if (q->symbol.value > low_func_vma) 2725 func = NULL; 2726 } 2727 2728 main_file_name = current_file_name = q->symbol.name; 2729 /* Look ahead to next symbol to check if that too is an N_SO. */ 2730 p++; 2731 if (*p == NULL) 2732 goto done; 2733 q = (aout_symbol_type *) (*p); 2734 if (q->type != (int)N_SO) 2735 goto next; 2736 2737 /* Found a second N_SO First is directory; second is filename. */ 2738 directory_name = current_file_name; 2739 main_file_name = current_file_name = q->symbol.name; 2740 if (obj_textsec (abfd) != section) 2741 goto done; 2742 break; 2743 case N_SOL: 2744 current_file_name = q->symbol.name; 2745 break; 2746 2747 case N_SLINE: 2748 2749 case N_DSLINE: 2750 case N_BSLINE: 2751 /* We'll keep this if it resolves nearer than the one we have 2752 already. */ 2753 if (q->symbol.value >= low_line_vma 2754 && q->symbol.value <= offset) 2755 { 2756 *line_ptr = q->desc; 2757 low_line_vma = q->symbol.value; 2758 line_file_name = current_file_name; 2759 line_directory_name = directory_name; 2760 } 2761 break; 2762 case N_FUN: 2763 { 2764 /* We'll keep this if it is nearer than the one we have already. */ 2765 if (q->symbol.value >= low_func_vma && 2766 q->symbol.value <= offset) 2767 { 2768 low_func_vma = q->symbol.value; 2769 func = (asymbol *)q; 2770 } 2771 else if (q->symbol.value > offset) 2772 goto done; 2773 } 2774 break; 2775 } 2776 } 2777 } 2778 2779 done: 2780 if (*line_ptr != 0) 2781 { 2782 main_file_name = line_file_name; 2783 directory_name = line_directory_name; 2784 } 2785 2786 if (main_file_name == NULL 2787 || IS_ABSOLUTE_PATH (main_file_name) 2788 || directory_name == NULL) 2789 filelen = 0; 2790 else 2791 filelen = strlen (directory_name) + strlen (main_file_name); 2792 2793 if (func == NULL) 2794 funclen = 0; 2795 else 2796 funclen = strlen (bfd_asymbol_name (func)); 2797 2798 if (adata (abfd).line_buf != NULL) 2799 free (adata (abfd).line_buf); 2800 2801 if (filelen + funclen == 0) 2802 adata (abfd).line_buf = buf = NULL; 2803 else 2804 { 2805 buf = (char *) bfd_malloc (filelen + funclen + 3); 2806 adata (abfd).line_buf = buf; 2807 if (buf == NULL) 2808 return FALSE; 2809 } 2810 2811 if (main_file_name != NULL) 2812 { 2813 if (IS_ABSOLUTE_PATH (main_file_name) || directory_name == NULL) 2814 *filename_ptr = main_file_name; 2815 else 2816 { 2817 sprintf (buf, "%s%s", directory_name, main_file_name); 2818 *filename_ptr = buf; 2819 buf += filelen + 1; 2820 } 2821 } 2822 2823 if (func) 2824 { 2825 const char *function = func->name; 2826 char *colon; 2827 2828 /* The caller expects a symbol name. We actually have a 2829 function name, without the leading underscore. Put the 2830 underscore back in, so that the caller gets a symbol name. */ 2831 if (bfd_get_symbol_leading_char (abfd) == '\0') 2832 strcpy (buf, function); 2833 else 2834 { 2835 buf[0] = bfd_get_symbol_leading_char (abfd); 2836 strcpy (buf + 1, function); 2837 } 2838 /* Have to remove : stuff. */ 2839 colon = strchr (buf, ':'); 2840 if (colon != NULL) 2841 *colon = '\0'; 2842 *functionname_ptr = buf; 2843 } 2844 2845 return TRUE; 2846 } 2847 2848 int 2849 NAME (aout, sizeof_headers) (bfd *abfd, 2850 struct bfd_link_info *info ATTRIBUTE_UNUSED) 2851 { 2852 return adata (abfd).exec_bytes_size; 2853 } 2854 2855 /* Free all information we have cached for this BFD. We can always 2856 read it again later if we need it. */ 2857 2858 bfd_boolean 2859 NAME (aout, bfd_free_cached_info) (bfd *abfd) 2860 { 2861 asection *o; 2862 2863 if (bfd_get_format (abfd) != bfd_object 2864 || abfd->tdata.aout_data == NULL) 2865 return TRUE; 2866 2867 #define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; } 2868 BFCI_FREE (obj_aout_symbols (abfd)); 2869 #ifdef USE_MMAP 2870 obj_aout_external_syms (abfd) = 0; 2871 bfd_free_window (&obj_aout_sym_window (abfd)); 2872 bfd_free_window (&obj_aout_string_window (abfd)); 2873 obj_aout_external_strings (abfd) = 0; 2874 #else 2875 BFCI_FREE (obj_aout_external_syms (abfd)); 2876 BFCI_FREE (obj_aout_external_strings (abfd)); 2877 #endif 2878 for (o = abfd->sections; o != NULL; o = o->next) 2879 BFCI_FREE (o->relocation); 2880 #undef BFCI_FREE 2881 2882 return TRUE; 2883 } 2884 2885 /* a.out link code. */ 2887 2888 /* Routine to create an entry in an a.out link hash table. */ 2889 2890 struct bfd_hash_entry * 2891 NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry, 2892 struct bfd_hash_table *table, 2893 const char *string) 2894 { 2895 struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry; 2896 2897 /* Allocate the structure if it has not already been allocated by a 2898 subclass. */ 2899 if (ret == NULL) 2900 ret = (struct aout_link_hash_entry *) bfd_hash_allocate (table, 2901 sizeof (* ret)); 2902 if (ret == NULL) 2903 return NULL; 2904 2905 /* Call the allocation method of the superclass. */ 2906 ret = ((struct aout_link_hash_entry *) 2907 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, 2908 table, string)); 2909 if (ret) 2910 { 2911 /* Set local fields. */ 2912 ret->written = FALSE; 2913 ret->indx = -1; 2914 } 2915 2916 return (struct bfd_hash_entry *) ret; 2917 } 2918 2919 /* Initialize an a.out link hash table. */ 2920 2921 bfd_boolean 2922 NAME (aout, link_hash_table_init) (struct aout_link_hash_table *table, 2923 bfd *abfd, 2924 struct bfd_hash_entry *(*newfunc) 2925 (struct bfd_hash_entry *, struct bfd_hash_table *, 2926 const char *), 2927 unsigned int entsize) 2928 { 2929 return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize); 2930 } 2931 2932 /* Create an a.out link hash table. */ 2933 2934 struct bfd_link_hash_table * 2935 NAME (aout, link_hash_table_create) (bfd *abfd) 2936 { 2937 struct aout_link_hash_table *ret; 2938 bfd_size_type amt = sizeof (* ret); 2939 2940 ret = (struct aout_link_hash_table *) bfd_malloc (amt); 2941 if (ret == NULL) 2942 return NULL; 2943 2944 if (!NAME (aout, link_hash_table_init) (ret, abfd, 2945 NAME (aout, link_hash_newfunc), 2946 sizeof (struct aout_link_hash_entry))) 2947 { 2948 free (ret); 2949 return NULL; 2950 } 2951 return &ret->root; 2952 } 2953 2954 /* Add all symbols from an object file to the hash table. */ 2955 2956 static bfd_boolean 2957 aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info) 2958 { 2959 bfd_boolean (*add_one_symbol) 2960 (struct bfd_link_info *, bfd *, const char *, flagword, asection *, 2961 bfd_vma, const char *, bfd_boolean, bfd_boolean, 2962 struct bfd_link_hash_entry **); 2963 struct external_nlist *syms; 2964 bfd_size_type sym_count; 2965 char *strings; 2966 bfd_boolean copy; 2967 struct aout_link_hash_entry **sym_hash; 2968 struct external_nlist *p; 2969 struct external_nlist *pend; 2970 bfd_size_type amt; 2971 2972 syms = obj_aout_external_syms (abfd); 2973 sym_count = obj_aout_external_sym_count (abfd); 2974 strings = obj_aout_external_strings (abfd); 2975 if (info->keep_memory) 2976 copy = FALSE; 2977 else 2978 copy = TRUE; 2979 2980 if (aout_backend_info (abfd)->add_dynamic_symbols != NULL) 2981 { 2982 if (! ((*aout_backend_info (abfd)->add_dynamic_symbols) 2983 (abfd, info, &syms, &sym_count, &strings))) 2984 return FALSE; 2985 } 2986 2987 if (sym_count == 0) 2988 return TRUE; /* Nothing to do. */ 2989 2990 /* We keep a list of the linker hash table entries that correspond 2991 to particular symbols. We could just look them up in the hash 2992 table, but keeping the list is more efficient. Perhaps this 2993 should be conditional on info->keep_memory. */ 2994 amt = sym_count * sizeof (struct aout_link_hash_entry *); 2995 sym_hash = (struct aout_link_hash_entry **) bfd_alloc (abfd, amt); 2996 if (sym_hash == NULL) 2997 return FALSE; 2998 obj_aout_sym_hashes (abfd) = sym_hash; 2999 3000 add_one_symbol = aout_backend_info (abfd)->add_one_symbol; 3001 if (add_one_symbol == NULL) 3002 add_one_symbol = _bfd_generic_link_add_one_symbol; 3003 3004 p = syms; 3005 pend = p + sym_count; 3006 for (; p < pend; p++, sym_hash++) 3007 { 3008 int type; 3009 const char *name; 3010 bfd_vma value; 3011 asection *section; 3012 flagword flags; 3013 const char *string; 3014 3015 *sym_hash = NULL; 3016 3017 type = H_GET_8 (abfd, p->e_type); 3018 3019 /* Ignore debugging symbols. */ 3020 if ((type & N_STAB) != 0) 3021 continue; 3022 3023 /* PR 19629: Corrupt binaries can contain illegal string offsets. */ 3024 if (GET_WORD (abfd, p->e_strx) > obj_aout_external_string_size (abfd)) 3025 return FALSE; 3026 name = strings + GET_WORD (abfd, p->e_strx); 3027 3028 value = GET_WORD (abfd, p->e_value); 3029 flags = BSF_GLOBAL; 3030 string = NULL; 3031 switch (type) 3032 { 3033 default: 3034 abort (); 3035 3036 case N_UNDF: 3037 case N_ABS: 3038 case N_TEXT: 3039 case N_DATA: 3040 case N_BSS: 3041 case N_FN_SEQ: 3042 case N_COMM: 3043 case N_SETV: 3044 case N_FN: 3045 /* Ignore symbols that are not externally visible. */ 3046 continue; 3047 case N_INDR: 3048 /* Ignore local indirect symbol. */ 3049 ++p; 3050 ++sym_hash; 3051 continue; 3052 3053 case N_UNDF | N_EXT: 3054 if (value == 0) 3055 { 3056 section = bfd_und_section_ptr; 3057 flags = 0; 3058 } 3059 else 3060 section = bfd_com_section_ptr; 3061 break; 3062 case N_ABS | N_EXT: 3063 section = bfd_abs_section_ptr; 3064 break; 3065 case N_TEXT | N_EXT: 3066 section = obj_textsec (abfd); 3067 value -= bfd_get_section_vma (abfd, section); 3068 break; 3069 case N_DATA | N_EXT: 3070 case N_SETV | N_EXT: 3071 /* Treat N_SETV symbols as N_DATA symbol; see comment in 3072 translate_from_native_sym_flags. */ 3073 section = obj_datasec (abfd); 3074 value -= bfd_get_section_vma (abfd, section); 3075 break; 3076 case N_BSS | N_EXT: 3077 section = obj_bsssec (abfd); 3078 value -= bfd_get_section_vma (abfd, section); 3079 break; 3080 case N_INDR | N_EXT: 3081 /* An indirect symbol. The next symbol is the symbol 3082 which this one really is. */ 3083 BFD_ASSERT (p + 1 < pend); 3084 ++p; 3085 /* PR 19629: Corrupt binaries can contain illegal string offsets. */ 3086 if (GET_WORD (abfd, p->e_strx) > obj_aout_external_string_size (abfd)) 3087 return FALSE; 3088 string = strings + GET_WORD (abfd, p->e_strx); 3089 section = bfd_ind_section_ptr; 3090 flags |= BSF_INDIRECT; 3091 break; 3092 case N_COMM | N_EXT: 3093 section = bfd_com_section_ptr; 3094 break; 3095 case N_SETA: case N_SETA | N_EXT: 3096 section = bfd_abs_section_ptr; 3097 flags |= BSF_CONSTRUCTOR; 3098 break; 3099 case N_SETT: case N_SETT | N_EXT: 3100 section = obj_textsec (abfd); 3101 flags |= BSF_CONSTRUCTOR; 3102 value -= bfd_get_section_vma (abfd, section); 3103 break; 3104 case N_SETD: case N_SETD | N_EXT: 3105 section = obj_datasec (abfd); 3106 flags |= BSF_CONSTRUCTOR; 3107 value -= bfd_get_section_vma (abfd, section); 3108 break; 3109 case N_SETB: case N_SETB | N_EXT: 3110 section = obj_bsssec (abfd); 3111 flags |= BSF_CONSTRUCTOR; 3112 value -= bfd_get_section_vma (abfd, section); 3113 break; 3114 case N_WARNING: 3115 /* A warning symbol. The next symbol is the one to warn 3116 about. If there is no next symbol, just look away. */ 3117 if (p + 1 >= pend) 3118 return TRUE; 3119 ++p; 3120 string = name; 3121 /* PR 19629: Corrupt binaries can contain illegal string offsets. */ 3122 if (GET_WORD (abfd, p->e_strx) > obj_aout_external_string_size (abfd)) 3123 return FALSE; 3124 name = strings + GET_WORD (abfd, p->e_strx); 3125 section = bfd_und_section_ptr; 3126 flags |= BSF_WARNING; 3127 break; 3128 case N_WEAKU: 3129 section = bfd_und_section_ptr; 3130 flags = BSF_WEAK; 3131 break; 3132 case N_WEAKA: 3133 section = bfd_abs_section_ptr; 3134 flags = BSF_WEAK; 3135 break; 3136 case N_WEAKT: 3137 section = obj_textsec (abfd); 3138 value -= bfd_get_section_vma (abfd, section); 3139 flags = BSF_WEAK; 3140 break; 3141 case N_WEAKD: 3142 section = obj_datasec (abfd); 3143 value -= bfd_get_section_vma (abfd, section); 3144 flags = BSF_WEAK; 3145 break; 3146 case N_WEAKB: 3147 section = obj_bsssec (abfd); 3148 value -= bfd_get_section_vma (abfd, section); 3149 flags = BSF_WEAK; 3150 break; 3151 } 3152 3153 if (! ((*add_one_symbol) 3154 (info, abfd, name, flags, section, value, string, copy, FALSE, 3155 (struct bfd_link_hash_entry **) sym_hash))) 3156 return FALSE; 3157 3158 /* Restrict the maximum alignment of a common symbol based on 3159 the architecture, since a.out has no way to represent 3160 alignment requirements of a section in a .o file. FIXME: 3161 This isn't quite right: it should use the architecture of the 3162 output file, not the input files. */ 3163 if ((*sym_hash)->root.type == bfd_link_hash_common 3164 && ((*sym_hash)->root.u.c.p->alignment_power > 3165 bfd_get_arch_info (abfd)->section_align_power)) 3166 (*sym_hash)->root.u.c.p->alignment_power = 3167 bfd_get_arch_info (abfd)->section_align_power; 3168 3169 /* If this is a set symbol, and we are not building sets, then 3170 it is possible for the hash entry to not have been set. In 3171 such a case, treat the symbol as not globally defined. */ 3172 if ((*sym_hash)->root.type == bfd_link_hash_new) 3173 { 3174 BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0); 3175 *sym_hash = NULL; 3176 } 3177 3178 if (type == (N_INDR | N_EXT) || type == N_WARNING) 3179 ++sym_hash; 3180 } 3181 3182 return TRUE; 3183 } 3184 3185 /* Free up the internal symbols read from an a.out file. */ 3186 3187 static bfd_boolean 3188 aout_link_free_symbols (bfd *abfd) 3189 { 3190 if (obj_aout_external_syms (abfd) != NULL) 3191 { 3192 #ifdef USE_MMAP 3193 bfd_free_window (&obj_aout_sym_window (abfd)); 3194 #else 3195 free ((void *) obj_aout_external_syms (abfd)); 3196 #endif 3197 obj_aout_external_syms (abfd) = NULL; 3198 } 3199 if (obj_aout_external_strings (abfd) != NULL) 3200 { 3201 #ifdef USE_MMAP 3202 bfd_free_window (&obj_aout_string_window (abfd)); 3203 #else 3204 free ((void *) obj_aout_external_strings (abfd)); 3205 #endif 3206 obj_aout_external_strings (abfd) = NULL; 3207 } 3208 return TRUE; 3209 } 3210 3211 /* Add symbols from an a.out object file. */ 3212 3213 static bfd_boolean 3214 aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) 3215 { 3216 if (! aout_get_external_symbols (abfd)) 3217 return FALSE; 3218 if (! aout_link_add_symbols (abfd, info)) 3219 return FALSE; 3220 if (! info->keep_memory) 3221 { 3222 if (! aout_link_free_symbols (abfd)) 3223 return FALSE; 3224 } 3225 return TRUE; 3226 } 3227 3228 /* Look through the internal symbols to see if this object file should 3229 be included in the link. We should include this object file if it 3230 defines any symbols which are currently undefined. If this object 3231 file defines a common symbol, then we may adjust the size of the 3232 known symbol but we do not include the object file in the link 3233 (unless there is some other reason to include it). */ 3234 3235 static bfd_boolean 3236 aout_link_check_ar_symbols (bfd *abfd, 3237 struct bfd_link_info *info, 3238 bfd_boolean *pneeded, 3239 bfd **subsbfd) 3240 { 3241 struct external_nlist *p; 3242 struct external_nlist *pend; 3243 char *strings; 3244 3245 *pneeded = FALSE; 3246 3247 /* Look through all the symbols. */ 3248 p = obj_aout_external_syms (abfd); 3249 pend = p + obj_aout_external_sym_count (abfd); 3250 strings = obj_aout_external_strings (abfd); 3251 for (; p < pend; p++) 3252 { 3253 int type = H_GET_8 (abfd, p->e_type); 3254 const char *name; 3255 struct bfd_link_hash_entry *h; 3256 3257 /* Ignore symbols that are not externally visible. This is an 3258 optimization only, as we check the type more thoroughly 3259 below. */ 3260 if (((type & N_EXT) == 0 3261 || (type & N_STAB) != 0 3262 || type == N_FN) 3263 && type != N_WEAKA 3264 && type != N_WEAKT 3265 && type != N_WEAKD 3266 && type != N_WEAKB) 3267 { 3268 if (type == N_WARNING 3269 || type == N_INDR) 3270 ++p; 3271 continue; 3272 } 3273 3274 name = strings + GET_WORD (abfd, p->e_strx); 3275 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE); 3276 3277 /* We are only interested in symbols that are currently 3278 undefined or common. */ 3279 if (h == NULL 3280 || (h->type != bfd_link_hash_undefined 3281 && h->type != bfd_link_hash_common)) 3282 { 3283 if (type == (N_INDR | N_EXT)) 3284 ++p; 3285 continue; 3286 } 3287 3288 if (type == (N_TEXT | N_EXT) 3289 || type == (N_DATA | N_EXT) 3290 || type == (N_BSS | N_EXT) 3291 || type == (N_ABS | N_EXT) 3292 || type == (N_INDR | N_EXT)) 3293 { 3294 /* This object file defines this symbol. We must link it 3295 in. This is true regardless of whether the current 3296 definition of the symbol is undefined or common. 3297 3298 If the current definition is common, we have a case in 3299 which we have already seen an object file including: 3300 int a; 3301 and this object file from the archive includes: 3302 int a = 5; 3303 In such a case, whether to include this object is target 3304 dependant for backward compatibility. 3305 3306 FIXME: The SunOS 4.1.3 linker will pull in the archive 3307 element if the symbol is defined in the .data section, 3308 but not if it is defined in the .text section. That 3309 seems a bit crazy to me, and it has not been implemented 3310 yet. However, it might be correct. */ 3311 if (h->type == bfd_link_hash_common) 3312 { 3313 int skip = 0; 3314 3315 switch (info->common_skip_ar_symbols) 3316 { 3317 case bfd_link_common_skip_text: 3318 skip = (type == (N_TEXT | N_EXT)); 3319 break; 3320 case bfd_link_common_skip_data: 3321 skip = (type == (N_DATA | N_EXT)); 3322 break; 3323 default: 3324 case bfd_link_common_skip_all: 3325 skip = 1; 3326 break; 3327 } 3328 3329 if (skip) 3330 continue; 3331 } 3332 3333 if (!(*info->callbacks 3334 ->add_archive_element) (info, abfd, name, subsbfd)) 3335 return FALSE; 3336 *pneeded = TRUE; 3337 return TRUE; 3338 } 3339 3340 if (type == (N_UNDF | N_EXT)) 3341 { 3342 bfd_vma value; 3343 3344 value = GET_WORD (abfd, p->e_value); 3345 if (value != 0) 3346 { 3347 /* This symbol is common in the object from the archive 3348 file. */ 3349 if (h->type == bfd_link_hash_undefined) 3350 { 3351 bfd *symbfd; 3352 unsigned int power; 3353 3354 symbfd = h->u.undef.abfd; 3355 if (symbfd == NULL) 3356 { 3357 /* This symbol was created as undefined from 3358 outside BFD. We assume that we should link 3359 in the object file. This is done for the -u 3360 option in the linker. */ 3361 if (!(*info->callbacks 3362 ->add_archive_element) (info, abfd, name, subsbfd)) 3363 return FALSE; 3364 *pneeded = TRUE; 3365 return TRUE; 3366 } 3367 /* Turn the current link symbol into a common 3368 symbol. It is already on the undefs list. */ 3369 h->type = bfd_link_hash_common; 3370 h->u.c.p = (struct bfd_link_hash_common_entry *) 3371 bfd_hash_allocate (&info->hash->table, 3372 sizeof (struct bfd_link_hash_common_entry)); 3373 if (h->u.c.p == NULL) 3374 return FALSE; 3375 3376 h->u.c.size = value; 3377 3378 /* FIXME: This isn't quite right. The maximum 3379 alignment of a common symbol should be set by the 3380 architecture of the output file, not of the input 3381 file. */ 3382 power = bfd_log2 (value); 3383 if (power > bfd_get_arch_info (abfd)->section_align_power) 3384 power = bfd_get_arch_info (abfd)->section_align_power; 3385 h->u.c.p->alignment_power = power; 3386 3387 h->u.c.p->section = bfd_make_section_old_way (symbfd, 3388 "COMMON"); 3389 } 3390 else 3391 { 3392 /* Adjust the size of the common symbol if 3393 necessary. */ 3394 if (value > h->u.c.size) 3395 h->u.c.size = value; 3396 } 3397 } 3398 } 3399 3400 if (type == N_WEAKA 3401 || type == N_WEAKT 3402 || type == N_WEAKD 3403 || type == N_WEAKB) 3404 { 3405 /* This symbol is weak but defined. We must pull it in if 3406 the current link symbol is undefined, but we don't want 3407 it if the current link symbol is common. */ 3408 if (h->type == bfd_link_hash_undefined) 3409 { 3410 if (!(*info->callbacks 3411 ->add_archive_element) (info, abfd, name, subsbfd)) 3412 return FALSE; 3413 *pneeded = TRUE; 3414 return TRUE; 3415 } 3416 } 3417 } 3418 3419 /* We do not need this object file. */ 3420 return TRUE; 3421 } 3422 /* Check a single archive element to see if we need to include it in 3423 the link. *PNEEDED is set according to whether this element is 3424 needed in the link or not. This is called from 3425 _bfd_generic_link_add_archive_symbols. */ 3426 3427 static bfd_boolean 3428 aout_link_check_archive_element (bfd *abfd, 3429 struct bfd_link_info *info, 3430 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED, 3431 const char *name ATTRIBUTE_UNUSED, 3432 bfd_boolean *pneeded) 3433 { 3434 bfd *oldbfd; 3435 bfd_boolean needed; 3436 3437 if (!aout_get_external_symbols (abfd)) 3438 return FALSE; 3439 3440 oldbfd = abfd; 3441 if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd)) 3442 return FALSE; 3443 3444 needed = *pneeded; 3445 if (needed) 3446 { 3447 /* Potentially, the add_archive_element hook may have set a 3448 substitute BFD for us. */ 3449 if (abfd != oldbfd) 3450 { 3451 if (!info->keep_memory 3452 && !aout_link_free_symbols (oldbfd)) 3453 return FALSE; 3454 if (!aout_get_external_symbols (abfd)) 3455 return FALSE; 3456 } 3457 if (!aout_link_add_symbols (abfd, info)) 3458 return FALSE; 3459 } 3460 3461 if (!info->keep_memory || !needed) 3462 { 3463 if (!aout_link_free_symbols (abfd)) 3464 return FALSE; 3465 } 3466 3467 return TRUE; 3468 } 3469 3470 /* Given an a.out BFD, add symbols to the global hash table as 3471 appropriate. */ 3472 3473 bfd_boolean 3474 NAME (aout, link_add_symbols) (bfd *abfd, struct bfd_link_info *info) 3475 { 3476 switch (bfd_get_format (abfd)) 3477 { 3478 case bfd_object: 3479 return aout_link_add_object_symbols (abfd, info); 3480 case bfd_archive: 3481 return _bfd_generic_link_add_archive_symbols 3482 (abfd, info, aout_link_check_archive_element); 3483 default: 3484 bfd_set_error (bfd_error_wrong_format); 3485 return FALSE; 3486 } 3487 } 3488 3489 /* A hash table used for header files with N_BINCL entries. */ 3491 3492 struct aout_link_includes_table 3493 { 3494 struct bfd_hash_table root; 3495 }; 3496 3497 /* A linked list of totals that we have found for a particular header 3498 file. */ 3499 3500 struct aout_link_includes_totals 3501 { 3502 struct aout_link_includes_totals *next; 3503 bfd_vma total; 3504 }; 3505 3506 /* An entry in the header file hash table. */ 3507 3508 struct aout_link_includes_entry 3509 { 3510 struct bfd_hash_entry root; 3511 /* List of totals we have found for this file. */ 3512 struct aout_link_includes_totals *totals; 3513 }; 3514 3515 /* Look up an entry in an the header file hash table. */ 3516 3517 #define aout_link_includes_lookup(table, string, create, copy) \ 3518 ((struct aout_link_includes_entry *) \ 3519 bfd_hash_lookup (&(table)->root, (string), (create), (copy))) 3520 3521 /* During the final link step we need to pass around a bunch of 3522 information, so we do it in an instance of this structure. */ 3523 3524 struct aout_final_link_info 3525 { 3526 /* General link information. */ 3527 struct bfd_link_info *info; 3528 /* Output bfd. */ 3529 bfd *output_bfd; 3530 /* Reloc file positions. */ 3531 file_ptr treloff, dreloff; 3532 /* File position of symbols. */ 3533 file_ptr symoff; 3534 /* String table. */ 3535 struct bfd_strtab_hash *strtab; 3536 /* Header file hash table. */ 3537 struct aout_link_includes_table includes; 3538 /* A buffer large enough to hold the contents of any section. */ 3539 bfd_byte *contents; 3540 /* A buffer large enough to hold the relocs of any section. */ 3541 void * relocs; 3542 /* A buffer large enough to hold the symbol map of any input BFD. */ 3543 int *symbol_map; 3544 /* A buffer large enough to hold output symbols of any input BFD. */ 3545 struct external_nlist *output_syms; 3546 }; 3547 3548 /* The function to create a new entry in the header file hash table. */ 3549 3550 static struct bfd_hash_entry * 3551 aout_link_includes_newfunc (struct bfd_hash_entry *entry, 3552 struct bfd_hash_table *table, 3553 const char *string) 3554 { 3555 struct aout_link_includes_entry *ret = 3556 (struct aout_link_includes_entry *) entry; 3557 3558 /* Allocate the structure if it has not already been allocated by a 3559 subclass. */ 3560 if (ret == NULL) 3561 ret = (struct aout_link_includes_entry *) 3562 bfd_hash_allocate (table, sizeof (* ret)); 3563 if (ret == NULL) 3564 return NULL; 3565 3566 /* Call the allocation method of the superclass. */ 3567 ret = ((struct aout_link_includes_entry *) 3568 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); 3569 if (ret) 3570 { 3571 /* Set local fields. */ 3572 ret->totals = NULL; 3573 } 3574 3575 return (struct bfd_hash_entry *) ret; 3576 } 3577 3578 /* Write out a symbol that was not associated with an a.out input 3579 object. */ 3580 3581 static bfd_boolean 3582 aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data) 3583 { 3584 struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh; 3585 struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data; 3586 bfd *output_bfd; 3587 int type; 3588 bfd_vma val; 3589 struct external_nlist outsym; 3590 bfd_size_type indx; 3591 bfd_size_type amt; 3592 3593 if (h->root.type == bfd_link_hash_warning) 3594 { 3595 h = (struct aout_link_hash_entry *) h->root.u.i.link; 3596 if (h->root.type == bfd_link_hash_new) 3597 return TRUE; 3598 } 3599 3600 output_bfd = flaginfo->output_bfd; 3601 3602 if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL) 3603 { 3604 if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol) 3605 (output_bfd, flaginfo->info, h))) 3606 { 3607 /* FIXME: No way to handle errors. */ 3608 abort (); 3609 } 3610 } 3611 3612 if (h->written) 3613 return TRUE; 3614 3615 h->written = TRUE; 3616 3617 /* An indx of -2 means the symbol must be written. */ 3618 if (h->indx != -2 3619 && (flaginfo->info->strip == strip_all 3620 || (flaginfo->info->strip == strip_some 3621 && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string, 3622 FALSE, FALSE) == NULL))) 3623 return TRUE; 3624 3625 switch (h->root.type) 3626 { 3627 default: 3628 case bfd_link_hash_warning: 3629 abort (); 3630 /* Avoid variable not initialized warnings. */ 3631 return TRUE; 3632 case bfd_link_hash_new: 3633 /* This can happen for set symbols when sets are not being 3634 built. */ 3635 return TRUE; 3636 case bfd_link_hash_undefined: 3637 type = N_UNDF | N_EXT; 3638 val = 0; 3639 break; 3640 case bfd_link_hash_defined: 3641 case bfd_link_hash_defweak: 3642 { 3643 asection *sec; 3644 3645 sec = h->root.u.def.section->output_section; 3646 BFD_ASSERT (bfd_is_abs_section (sec) 3647 || sec->owner == output_bfd); 3648 if (sec == obj_textsec (output_bfd)) 3649 type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT; 3650 else if (sec == obj_datasec (output_bfd)) 3651 type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD; 3652 else if (sec == obj_bsssec (output_bfd)) 3653 type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB; 3654 else 3655 type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA; 3656 type |= N_EXT; 3657 val = (h->root.u.def.value 3658 + sec->vma 3659 + h->root.u.def.section->output_offset); 3660 } 3661 break; 3662 case bfd_link_hash_common: 3663 type = N_UNDF | N_EXT; 3664 val = h->root.u.c.size; 3665 break; 3666 case bfd_link_hash_undefweak: 3667 type = N_WEAKU; 3668 val = 0; 3669 break; 3670 case bfd_link_hash_indirect: 3671 /* We ignore these symbols, since the indirected symbol is 3672 already in the hash table. */ 3673 return TRUE; 3674 } 3675 3676 H_PUT_8 (output_bfd, type, outsym.e_type); 3677 H_PUT_8 (output_bfd, 0, outsym.e_other); 3678 H_PUT_16 (output_bfd, 0, outsym.e_desc); 3679 indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string, 3680 FALSE); 3681 if (indx == - (bfd_size_type) 1) 3682 /* FIXME: No way to handle errors. */ 3683 abort (); 3684 3685 PUT_WORD (output_bfd, indx, outsym.e_strx); 3686 PUT_WORD (output_bfd, val, outsym.e_value); 3687 3688 amt = EXTERNAL_NLIST_SIZE; 3689 if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0 3690 || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt) 3691 /* FIXME: No way to handle errors. */ 3692 abort (); 3693 3694 flaginfo->symoff += EXTERNAL_NLIST_SIZE; 3695 h->indx = obj_aout_external_sym_count (output_bfd); 3696 ++obj_aout_external_sym_count (output_bfd); 3697 3698 return TRUE; 3699 } 3700 3701 /* Handle a link order which is supposed to generate a reloc. */ 3702 3703 static bfd_boolean 3704 aout_link_reloc_link_order (struct aout_final_link_info *flaginfo, 3705 asection *o, 3706 struct bfd_link_order *p) 3707 { 3708 struct bfd_link_order_reloc *pr; 3709 int r_index; 3710 int r_extern; 3711 reloc_howto_type *howto; 3712 file_ptr *reloff_ptr = NULL; 3713 struct reloc_std_external srel; 3714 struct reloc_ext_external erel; 3715 void * rel_ptr; 3716 bfd_size_type amt; 3717 3718 pr = p->u.reloc.p; 3719 3720 if (p->type == bfd_section_reloc_link_order) 3721 { 3722 r_extern = 0; 3723 if (bfd_is_abs_section (pr->u.section)) 3724 r_index = N_ABS | N_EXT; 3725 else 3726 { 3727 BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd); 3728 r_index = pr->u.section->target_index; 3729 } 3730 } 3731 else 3732 { 3733 struct aout_link_hash_entry *h; 3734 3735 BFD_ASSERT (p->type == bfd_symbol_reloc_link_order); 3736 r_extern = 1; 3737 h = ((struct aout_link_hash_entry *) 3738 bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info, 3739 pr->u.name, FALSE, FALSE, TRUE)); 3740 if (h != NULL 3741 && h->indx >= 0) 3742 r_index = h->indx; 3743 else if (h != NULL) 3744 { 3745 /* We decided to strip this symbol, but it turns out that we 3746 can't. Note that we lose the other and desc information 3747 here. I don't think that will ever matter for a global 3748 symbol. */ 3749 h->indx = -2; 3750 h->written = FALSE; 3751 if (!aout_link_write_other_symbol (&h->root.root, flaginfo)) 3752 return FALSE; 3753 r_index = h->indx; 3754 } 3755 else 3756 { 3757 (*flaginfo->info->callbacks->unattached_reloc) 3758 (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0); 3759 r_index = 0; 3760 } 3761 } 3762 3763 howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc); 3764 if (howto == 0) 3765 { 3766 bfd_set_error (bfd_error_bad_value); 3767 return FALSE; 3768 } 3769 3770 if (o == obj_textsec (flaginfo->output_bfd)) 3771 reloff_ptr = &flaginfo->treloff; 3772 else if (o == obj_datasec (flaginfo->output_bfd)) 3773 reloff_ptr = &flaginfo->dreloff; 3774 else 3775 abort (); 3776 3777 if (obj_reloc_entry_size (flaginfo->output_bfd) == RELOC_STD_SIZE) 3778 { 3779 #ifdef MY_put_reloc 3780 MY_put_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset, howto, 3781 &srel); 3782 #else 3783 { 3784 int r_pcrel; 3785 int r_baserel; 3786 int r_jmptable; 3787 int r_relative; 3788 int r_length; 3789 3790 r_pcrel = (int) howto->pc_relative; 3791 r_baserel = (howto->type & 8) != 0; 3792 r_jmptable = (howto->type & 16) != 0; 3793 r_relative = (howto->type & 32) != 0; 3794 r_length = howto->size; 3795 3796 PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address); 3797 if (bfd_header_big_endian (flaginfo->output_bfd)) 3798 { 3799 srel.r_index[0] = r_index >> 16; 3800 srel.r_index[1] = r_index >> 8; 3801 srel.r_index[2] = r_index; 3802 srel.r_type[0] = 3803 ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) 3804 | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) 3805 | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0) 3806 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0) 3807 | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0) 3808 | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); 3809 } 3810 else 3811 { 3812 srel.r_index[2] = r_index >> 16; 3813 srel.r_index[1] = r_index >> 8; 3814 srel.r_index[0] = r_index; 3815 srel.r_type[0] = 3816 ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) 3817 | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) 3818 | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0) 3819 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0) 3820 | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0) 3821 | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); 3822 } 3823 } 3824 #endif 3825 rel_ptr = (void *) &srel; 3826 3827 /* We have to write the addend into the object file, since 3828 standard a.out relocs are in place. It would be more 3829 reliable if we had the current contents of the file here, 3830 rather than assuming zeroes, but we can't read the file since 3831 it was opened using bfd_openw. */ 3832 if (pr->addend != 0) 3833 { 3834 bfd_size_type size; 3835 bfd_reloc_status_type r; 3836 bfd_byte *buf; 3837 bfd_boolean ok; 3838 3839 size = bfd_get_reloc_size (howto); 3840 buf = (bfd_byte *) bfd_zmalloc (size); 3841 if (buf == NULL && size != 0) 3842 return FALSE; 3843 r = MY_relocate_contents (howto, flaginfo->output_bfd, 3844 (bfd_vma) pr->addend, buf); 3845 switch (r) 3846 { 3847 case bfd_reloc_ok: 3848 break; 3849 default: 3850 case bfd_reloc_outofrange: 3851 abort (); 3852 case bfd_reloc_overflow: 3853 (*flaginfo->info->callbacks->reloc_overflow) 3854 (flaginfo->info, NULL, 3855 (p->type == bfd_section_reloc_link_order 3856 ? bfd_section_name (flaginfo->output_bfd, 3857 pr->u.section) 3858 : pr->u.name), 3859 howto->name, pr->addend, NULL, NULL, (bfd_vma) 0); 3860 break; 3861 } 3862 ok = bfd_set_section_contents (flaginfo->output_bfd, o, (void *) buf, 3863 (file_ptr) p->offset, size); 3864 free (buf); 3865 if (! ok) 3866 return FALSE; 3867 } 3868 } 3869 else 3870 { 3871 #ifdef MY_put_ext_reloc 3872 MY_put_ext_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset, 3873 howto, &erel, pr->addend); 3874 #else 3875 PUT_WORD (flaginfo->output_bfd, p->offset, erel.r_address); 3876 3877 if (bfd_header_big_endian (flaginfo->output_bfd)) 3878 { 3879 erel.r_index[0] = r_index >> 16; 3880 erel.r_index[1] = r_index >> 8; 3881 erel.r_index[2] = r_index; 3882 erel.r_type[0] = 3883 ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0) 3884 | (howto->type << RELOC_EXT_BITS_TYPE_SH_BIG)); 3885 } 3886 else 3887 { 3888 erel.r_index[2] = r_index >> 16; 3889 erel.r_index[1] = r_index >> 8; 3890 erel.r_index[0] = r_index; 3891 erel.r_type[0] = 3892 (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0) 3893 | (howto->type << RELOC_EXT_BITS_TYPE_SH_LITTLE); 3894 } 3895 3896 PUT_WORD (flaginfo->output_bfd, (bfd_vma) pr->addend, erel.r_addend); 3897 #endif /* MY_put_ext_reloc */ 3898 3899 rel_ptr = (void *) &erel; 3900 } 3901 3902 amt = obj_reloc_entry_size (flaginfo->output_bfd); 3903 if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0 3904 || bfd_bwrite (rel_ptr, amt, flaginfo->output_bfd) != amt) 3905 return FALSE; 3906 3907 *reloff_ptr += obj_reloc_entry_size (flaginfo->output_bfd); 3908 3909 /* Assert that the relocs have not run into the symbols, and that n 3910 the text relocs have not run into the data relocs. */ 3911 BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd) 3912 && (reloff_ptr != &flaginfo->treloff 3913 || (*reloff_ptr 3914 <= obj_datasec (flaginfo->output_bfd)->rel_filepos))); 3915 3916 return TRUE; 3917 } 3918 3919 /* Get the section corresponding to a reloc index. */ 3920 3921 static INLINE asection * 3922 aout_reloc_index_to_section (bfd *abfd, int indx) 3923 { 3924 switch (indx & N_TYPE) 3925 { 3926 case N_TEXT: return obj_textsec (abfd); 3927 case N_DATA: return obj_datasec (abfd); 3928 case N_BSS: return obj_bsssec (abfd); 3929 case N_ABS: 3930 case N_UNDF: return bfd_abs_section_ptr; 3931 default: abort (); 3932 } 3933 return NULL; 3934 } 3935 3936 /* Relocate an a.out section using standard a.out relocs. */ 3937 3938 static bfd_boolean 3939 aout_link_input_section_std (struct aout_final_link_info *flaginfo, 3940 bfd *input_bfd, 3941 asection *input_section, 3942 struct reloc_std_external *relocs, 3943 bfd_size_type rel_size, 3944 bfd_byte *contents) 3945 { 3946 bfd_boolean (*check_dynamic_reloc) 3947 (struct bfd_link_info *, bfd *, asection *, 3948 struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *, 3949 bfd_vma *); 3950 bfd *output_bfd; 3951 bfd_boolean relocatable; 3952 struct external_nlist *syms; 3953 char *strings; 3954 struct aout_link_hash_entry **sym_hashes; 3955 int *symbol_map; 3956 bfd_size_type reloc_count; 3957 struct reloc_std_external *rel; 3958 struct reloc_std_external *rel_end; 3959 3960 output_bfd = flaginfo->output_bfd; 3961 check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc; 3962 3963 BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE); 3964 BFD_ASSERT (input_bfd->xvec->header_byteorder 3965 == output_bfd->xvec->header_byteorder); 3966 3967 relocatable = bfd_link_relocatable (flaginfo->info); 3968 syms = obj_aout_external_syms (input_bfd); 3969 strings = obj_aout_external_strings (input_bfd); 3970 sym_hashes = obj_aout_sym_hashes (input_bfd); 3971 symbol_map = flaginfo->symbol_map; 3972 3973 reloc_count = rel_size / RELOC_STD_SIZE; 3974 rel = relocs; 3975 rel_end = rel + reloc_count; 3976 for (; rel < rel_end; rel++) 3977 { 3978 bfd_vma r_addr; 3979 int r_index; 3980 int r_extern; 3981 int r_pcrel; 3982 int r_baserel = 0; 3983 reloc_howto_type *howto; 3984 struct aout_link_hash_entry *h = NULL; 3985 bfd_vma relocation; 3986 bfd_reloc_status_type r; 3987 3988 r_addr = GET_SWORD (input_bfd, rel->r_address); 3989 3990 #ifdef MY_reloc_howto 3991 howto = MY_reloc_howto (input_bfd, rel, r_index, r_extern, r_pcrel); 3992 #else 3993 { 3994 int r_jmptable; 3995 int r_relative; 3996 int r_length; 3997 unsigned int howto_idx; 3998 3999 if (bfd_header_big_endian (input_bfd)) 4000 { 4001 r_index = (((unsigned int) rel->r_index[0] << 16) 4002 | ((unsigned int) rel->r_index[1] << 8) 4003 | rel->r_index[2]); 4004 r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); 4005 r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); 4006 r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG)); 4007 r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG)); 4008 r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG)); 4009 r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) 4010 >> RELOC_STD_BITS_LENGTH_SH_BIG); 4011 } 4012 else 4013 { 4014 r_index = (((unsigned int) rel->r_index[2] << 16) 4015 | ((unsigned int) rel->r_index[1] << 8) 4016 | rel->r_index[0]); 4017 r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); 4018 r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); 4019 r_baserel = (0 != (rel->r_type[0] 4020 & RELOC_STD_BITS_BASEREL_LITTLE)); 4021 r_jmptable= (0 != (rel->r_type[0] 4022 & RELOC_STD_BITS_JMPTABLE_LITTLE)); 4023 r_relative= (0 != (rel->r_type[0] 4024 & RELOC_STD_BITS_RELATIVE_LITTLE)); 4025 r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) 4026 >> RELOC_STD_BITS_LENGTH_SH_LITTLE); 4027 } 4028 4029 howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel 4030 + 16 * r_jmptable + 32 * r_relative); 4031 if (howto_idx < TABLE_SIZE (howto_table_std)) 4032 howto = howto_table_std + howto_idx; 4033 else 4034 howto = NULL; 4035 } 4036 #endif 4037 4038 if (howto == NULL) 4039 { 4040 (*flaginfo->info->callbacks->einfo) 4041 (_("%P: %B: unexpected relocation type\n"), input_bfd); 4042 bfd_set_error (bfd_error_bad_value); 4043 return FALSE; 4044 } 4045 4046 if (relocatable) 4047 { 4048 /* We are generating a relocatable output file, and must 4049 modify the reloc accordingly. */ 4050 if (r_extern) 4051 { 4052 /* If we know the symbol this relocation is against, 4053 convert it into a relocation against a section. This 4054 is what the native linker does. */ 4055 h = sym_hashes[r_index]; 4056 if (h != NULL 4057 && (h->root.type == bfd_link_hash_defined 4058 || h->root.type == bfd_link_hash_defweak)) 4059 { 4060 asection *output_section; 4061 4062 /* Change the r_extern value. */ 4063 if (bfd_header_big_endian (output_bfd)) 4064 rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_BIG; 4065 else 4066 rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_LITTLE; 4067 4068 /* Compute a new r_index. */ 4069 output_section = h->root.u.def.section->output_section; 4070 if (output_section == obj_textsec (output_bfd)) 4071 r_index = N_TEXT; 4072 else if (output_section == obj_datasec (output_bfd)) 4073 r_index = N_DATA; 4074 else if (output_section == obj_bsssec (output_bfd)) 4075 r_index = N_BSS; 4076 else 4077 r_index = N_ABS; 4078 4079 /* Add the symbol value and the section VMA to the 4080 addend stored in the contents. */ 4081 relocation = (h->root.u.def.value 4082 + output_section->vma 4083 + h->root.u.def.section->output_offset); 4084 } 4085 else 4086 { 4087 /* We must change r_index according to the symbol 4088 map. */ 4089 r_index = symbol_map[r_index]; 4090 4091 if (r_index == -1) 4092 { 4093 if (h != NULL) 4094 { 4095 /* We decided to strip this symbol, but it 4096 turns out that we can't. Note that we 4097 lose the other and desc information here. 4098 I don't think that will ever matter for a 4099 global symbol. */ 4100 if (h->indx < 0) 4101 { 4102 h->indx = -2; 4103 h->written = FALSE; 4104 if (!aout_link_write_other_symbol (&h->root.root, 4105 flaginfo)) 4106 return FALSE; 4107 } 4108 r_index = h->indx; 4109 } 4110 else 4111 { 4112 const char *name; 4113 4114 name = strings + GET_WORD (input_bfd, 4115 syms[r_index].e_strx); 4116 (*flaginfo->info->callbacks->unattached_reloc) 4117 (flaginfo->info, name, 4118 input_bfd, input_section, r_addr); 4119 r_index = 0; 4120 } 4121 } 4122 4123 relocation = 0; 4124 } 4125 4126 /* Write out the new r_index value. */ 4127 if (bfd_header_big_endian (output_bfd)) 4128 { 4129 rel->r_index[0] = r_index >> 16; 4130 rel->r_index[1] = r_index >> 8; 4131 rel->r_index[2] = r_index; 4132 } 4133 else 4134 { 4135 rel->r_index[2] = r_index >> 16; 4136 rel->r_index[1] = r_index >> 8; 4137 rel->r_index[0] = r_index; 4138 } 4139 } 4140 else 4141 { 4142 asection *section; 4143 4144 /* This is a relocation against a section. We must 4145 adjust by the amount that the section moved. */ 4146 section = aout_reloc_index_to_section (input_bfd, r_index); 4147 relocation = (section->output_section->vma 4148 + section->output_offset 4149 - section->vma); 4150 } 4151 4152 /* Change the address of the relocation. */ 4153 PUT_WORD (output_bfd, 4154 r_addr + input_section->output_offset, 4155 rel->r_address); 4156 4157 /* Adjust a PC relative relocation by removing the reference 4158 to the original address in the section and including the 4159 reference to the new address. */ 4160 if (r_pcrel) 4161 relocation -= (input_section->output_section->vma 4162 + input_section->output_offset 4163 - input_section->vma); 4164 4165 #ifdef MY_relocatable_reloc 4166 MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr); 4167 #endif 4168 4169 if (relocation == 0) 4170 r = bfd_reloc_ok; 4171 else 4172 r = MY_relocate_contents (howto, 4173 input_bfd, relocation, 4174 contents + r_addr); 4175 } 4176 else 4177 { 4178 bfd_boolean hundef; 4179 4180 /* We are generating an executable, and must do a full 4181 relocation. */ 4182 hundef = FALSE; 4183 4184 if (r_extern) 4185 { 4186 h = sym_hashes[r_index]; 4187 4188 if (h != NULL 4189 && (h->root.type == bfd_link_hash_defined 4190 || h->root.type == bfd_link_hash_defweak)) 4191 { 4192 relocation = (h->root.u.def.value 4193 + h->root.u.def.section->output_section->vma 4194 + h->root.u.def.section->output_offset); 4195 } 4196 else if (h != NULL 4197 && h->root.type == bfd_link_hash_undefweak) 4198 relocation = 0; 4199 else 4200 { 4201 hundef = TRUE; 4202 relocation = 0; 4203 } 4204 } 4205 else 4206 { 4207 asection *section; 4208 4209 section = aout_reloc_index_to_section (input_bfd, r_index); 4210 relocation = (section->output_section->vma 4211 + section->output_offset 4212 - section->vma); 4213 if (r_pcrel) 4214 relocation += input_section->vma; 4215 } 4216 4217 if (check_dynamic_reloc != NULL) 4218 { 4219 bfd_boolean skip; 4220 4221 if (! ((*check_dynamic_reloc) 4222 (flaginfo->info, input_bfd, input_section, h, 4223 (void *) rel, contents, &skip, &relocation))) 4224 return FALSE; 4225 if (skip) 4226 continue; 4227 } 4228 4229 /* Now warn if a global symbol is undefined. We could not 4230 do this earlier, because check_dynamic_reloc might want 4231 to skip this reloc. */ 4232 if (hundef && ! bfd_link_pic (flaginfo->info) && ! r_baserel) 4233 { 4234 const char *name; 4235 4236 if (h != NULL) 4237 name = h->root.root.string; 4238 else 4239 name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); 4240 (*flaginfo->info->callbacks->undefined_symbol) 4241 (flaginfo->info, name, input_bfd, input_section, r_addr, TRUE); 4242 } 4243 4244 r = MY_final_link_relocate (howto, 4245 input_bfd, input_section, 4246 contents, r_addr, relocation, 4247 (bfd_vma) 0); 4248 } 4249 4250 if (r != bfd_reloc_ok) 4251 { 4252 switch (r) 4253 { 4254 default: 4255 case bfd_reloc_outofrange: 4256 abort (); 4257 case bfd_reloc_overflow: 4258 { 4259 const char *name; 4260 4261 if (h != NULL) 4262 name = NULL; 4263 else if (r_extern) 4264 name = strings + GET_WORD (input_bfd, 4265 syms[r_index].e_strx); 4266 else 4267 { 4268 asection *s; 4269 4270 s = aout_reloc_index_to_section (input_bfd, r_index); 4271 name = bfd_section_name (input_bfd, s); 4272 } 4273 (*flaginfo->info->callbacks->reloc_overflow) 4274 (flaginfo->info, (h ? &h->root : NULL), name, howto->name, 4275 (bfd_vma) 0, input_bfd, input_section, r_addr); 4276 } 4277 break; 4278 } 4279 } 4280 } 4281 4282 return TRUE; 4283 } 4284 4285 /* Relocate an a.out section using extended a.out relocs. */ 4286 4287 static bfd_boolean 4288 aout_link_input_section_ext (struct aout_final_link_info *flaginfo, 4289 bfd *input_bfd, 4290 asection *input_section, 4291 struct reloc_ext_external *relocs, 4292 bfd_size_type rel_size, 4293 bfd_byte *contents) 4294 { 4295 bfd_boolean (*check_dynamic_reloc) 4296 (struct bfd_link_info *, bfd *, asection *, 4297 struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *, 4298 bfd_vma *); 4299 bfd *output_bfd; 4300 bfd_boolean relocatable; 4301 struct external_nlist *syms; 4302 char *strings; 4303 struct aout_link_hash_entry **sym_hashes; 4304 int *symbol_map; 4305 bfd_size_type reloc_count; 4306 struct reloc_ext_external *rel; 4307 struct reloc_ext_external *rel_end; 4308 4309 output_bfd = flaginfo->output_bfd; 4310 check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc; 4311 4312 BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_EXT_SIZE); 4313 BFD_ASSERT (input_bfd->xvec->header_byteorder 4314 == output_bfd->xvec->header_byteorder); 4315 4316 relocatable = bfd_link_relocatable (flaginfo->info); 4317 syms = obj_aout_external_syms (input_bfd); 4318 strings = obj_aout_external_strings (input_bfd); 4319 sym_hashes = obj_aout_sym_hashes (input_bfd); 4320 symbol_map = flaginfo->symbol_map; 4321 4322 reloc_count = rel_size / RELOC_EXT_SIZE; 4323 rel = relocs; 4324 rel_end = rel + reloc_count; 4325 for (; rel < rel_end; rel++) 4326 { 4327 bfd_vma r_addr; 4328 int r_index; 4329 int r_extern; 4330 unsigned int r_type; 4331 bfd_vma r_addend; 4332 struct aout_link_hash_entry *h = NULL; 4333 asection *r_section = NULL; 4334 bfd_vma relocation; 4335 4336 r_addr = GET_SWORD (input_bfd, rel->r_address); 4337 4338 if (bfd_header_big_endian (input_bfd)) 4339 { 4340 r_index = (((unsigned int) rel->r_index[0] << 16) 4341 | ((unsigned int) rel->r_index[1] << 8) 4342 | rel->r_index[2]); 4343 r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG)); 4344 r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) 4345 >> RELOC_EXT_BITS_TYPE_SH_BIG); 4346 } 4347 else 4348 { 4349 r_index = (((unsigned int) rel->r_index[2] << 16) 4350 | ((unsigned int) rel->r_index[1] << 8) 4351 | rel->r_index[0]); 4352 r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE)); 4353 r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) 4354 >> RELOC_EXT_BITS_TYPE_SH_LITTLE); 4355 } 4356 4357 r_addend = GET_SWORD (input_bfd, rel->r_addend); 4358 4359 if (r_type >= TABLE_SIZE (howto_table_ext)) 4360 { 4361 (*flaginfo->info->callbacks->einfo) 4362 (_("%P: %B: unexpected relocation type\n"), input_bfd); 4363 bfd_set_error (bfd_error_bad_value); 4364 return FALSE; 4365 } 4366 4367 if (relocatable) 4368 { 4369 /* We are generating a relocatable output file, and must 4370 modify the reloc accordingly. */ 4371 if (r_extern 4372 || r_type == (unsigned int) RELOC_BASE10 4373 || r_type == (unsigned int) RELOC_BASE13 4374 || r_type == (unsigned int) RELOC_BASE22) 4375 { 4376 /* If we know the symbol this relocation is against, 4377 convert it into a relocation against a section. This 4378 is what the native linker does. */ 4379 if (r_type == (unsigned int) RELOC_BASE10 4380 || r_type == (unsigned int) RELOC_BASE13 4381 || r_type == (unsigned int) RELOC_BASE22) 4382 h = NULL; 4383 else 4384 h = sym_hashes[r_index]; 4385 if (h != NULL 4386 && (h->root.type == bfd_link_hash_defined 4387 || h->root.type == bfd_link_hash_defweak)) 4388 { 4389 asection *output_section; 4390 4391 /* Change the r_extern value. */ 4392 if (bfd_header_big_endian (output_bfd)) 4393 rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_BIG; 4394 else 4395 rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_LITTLE; 4396 4397 /* Compute a new r_index. */ 4398 output_section = h->root.u.def.section->output_section; 4399 if (output_section == obj_textsec (output_bfd)) 4400 r_index = N_TEXT; 4401 else if (output_section == obj_datasec (output_bfd)) 4402 r_index = N_DATA; 4403 else if (output_section == obj_bsssec (output_bfd)) 4404 r_index = N_BSS; 4405 else 4406 r_index = N_ABS; 4407 4408 /* Add the symbol value and the section VMA to the 4409 addend. */ 4410 relocation = (h->root.u.def.value 4411 + output_section->vma 4412 + h->root.u.def.section->output_offset); 4413 4414 /* Now RELOCATION is the VMA of the final 4415 destination. If this is a PC relative reloc, 4416 then ADDEND is the negative of the source VMA. 4417 We want to set ADDEND to the difference between 4418 the destination VMA and the source VMA, which 4419 means we must adjust RELOCATION by the change in 4420 the source VMA. This is done below. */ 4421 } 4422 else 4423 { 4424 /* We must change r_index according to the symbol 4425 map. */ 4426 r_index = symbol_map[r_index]; 4427 4428 if (r_index == -1) 4429 { 4430 if (h != NULL) 4431 { 4432 /* We decided to strip this symbol, but it 4433 turns out that we can't. Note that we 4434 lose the other and desc information here. 4435 I don't think that will ever matter for a 4436 global symbol. */ 4437 if (h->indx < 0) 4438 { 4439 h->indx = -2; 4440 h->written = FALSE; 4441 if (!aout_link_write_other_symbol (&h->root.root, 4442 flaginfo)) 4443 return FALSE; 4444 } 4445 r_index = h->indx; 4446 } 4447 else 4448 { 4449 const char *name; 4450 4451 name = strings + GET_WORD (input_bfd, 4452 syms[r_index].e_strx); 4453 (*flaginfo->info->callbacks->unattached_reloc) 4454 (flaginfo->info, name, 4455 input_bfd, input_section, r_addr); 4456 r_index = 0; 4457 } 4458 } 4459 4460 relocation = 0; 4461 4462 /* If this is a PC relative reloc, then the addend 4463 is the negative of the source VMA. We must 4464 adjust it by the change in the source VMA. This 4465 is done below. */ 4466 } 4467 4468 /* Write out the new r_index value. */ 4469 if (bfd_header_big_endian (output_bfd)) 4470 { 4471 rel->r_index[0] = r_index >> 16; 4472 rel->r_index[1] = r_index >> 8; 4473 rel->r_index[2] = r_index; 4474 } 4475 else 4476 { 4477 rel->r_index[2] = r_index >> 16; 4478 rel->r_index[1] = r_index >> 8; 4479 rel->r_index[0] = r_index; 4480 } 4481 } 4482 else 4483 { 4484 /* This is a relocation against a section. We must 4485 adjust by the amount that the section moved. */ 4486 r_section = aout_reloc_index_to_section (input_bfd, r_index); 4487 relocation = (r_section->output_section->vma 4488 + r_section->output_offset 4489 - r_section->vma); 4490 4491 /* If this is a PC relative reloc, then the addend is 4492 the difference in VMA between the destination and the 4493 source. We have just adjusted for the change in VMA 4494 of the destination, so we must also adjust by the 4495 change in VMA of the source. This is done below. */ 4496 } 4497 4498 /* As described above, we must always adjust a PC relative 4499 reloc by the change in VMA of the source. However, if 4500 pcrel_offset is set, then the addend does not include the 4501 location within the section, in which case we don't need 4502 to adjust anything. */ 4503 if (howto_table_ext[r_type].pc_relative 4504 && ! howto_table_ext[r_type].pcrel_offset) 4505 relocation -= (input_section->output_section->vma 4506 + input_section->output_offset 4507 - input_section->vma); 4508 4509 /* Change the addend if necessary. */ 4510 if (relocation != 0) 4511 PUT_WORD (output_bfd, r_addend + relocation, rel->r_addend); 4512 4513 /* Change the address of the relocation. */ 4514 PUT_WORD (output_bfd, 4515 r_addr + input_section->output_offset, 4516 rel->r_address); 4517 } 4518 else 4519 { 4520 bfd_boolean hundef; 4521 bfd_reloc_status_type r; 4522 4523 /* We are generating an executable, and must do a full 4524 relocation. */ 4525 hundef = FALSE; 4526 4527 if (r_extern) 4528 { 4529 h = sym_hashes[r_index]; 4530 4531 if (h != NULL 4532 && (h->root.type == bfd_link_hash_defined 4533 || h->root.type == bfd_link_hash_defweak)) 4534 { 4535 relocation = (h->root.u.def.value 4536 + h->root.u.def.section->output_section->vma 4537 + h->root.u.def.section->output_offset); 4538 } 4539 else if (h != NULL 4540 && h->root.type == bfd_link_hash_undefweak) 4541 relocation = 0; 4542 else 4543 { 4544 hundef = TRUE; 4545 relocation = 0; 4546 } 4547 } 4548 else if (r_type == (unsigned int) RELOC_BASE10 4549 || r_type == (unsigned int) RELOC_BASE13 4550 || r_type == (unsigned int) RELOC_BASE22) 4551 { 4552 struct external_nlist *sym; 4553 int type; 4554 4555 /* For base relative relocs, r_index is always an index 4556 into the symbol table, even if r_extern is 0. */ 4557 sym = syms + r_index; 4558 type = H_GET_8 (input_bfd, sym->e_type); 4559 if ((type & N_TYPE) == N_TEXT 4560 || type == N_WEAKT) 4561 r_section = obj_textsec (input_bfd); 4562 else if ((type & N_TYPE) == N_DATA 4563 || type == N_WEAKD) 4564 r_section = obj_datasec (input_bfd); 4565 else if ((type & N_TYPE) == N_BSS 4566 || type == N_WEAKB) 4567 r_section = obj_bsssec (input_bfd); 4568 else if ((type & N_TYPE) == N_ABS 4569 || type == N_WEAKA) 4570 r_section = bfd_abs_section_ptr; 4571 else 4572 abort (); 4573 relocation = (r_section->output_section->vma 4574 + r_section->output_offset 4575 + (GET_WORD (input_bfd, sym->e_value) 4576 - r_section->vma)); 4577 } 4578 else 4579 { 4580 r_section = aout_reloc_index_to_section (input_bfd, r_index); 4581 4582 /* If this is a PC relative reloc, then R_ADDEND is the 4583 difference between the two vmas, or 4584 old_dest_sec + old_dest_off - (old_src_sec + old_src_off) 4585 where 4586 old_dest_sec == section->vma 4587 and 4588 old_src_sec == input_section->vma 4589 and 4590 old_src_off == r_addr 4591 4592 _bfd_final_link_relocate expects RELOCATION + 4593 R_ADDEND to be the VMA of the destination minus 4594 r_addr (the minus r_addr is because this relocation 4595 is not pcrel_offset, which is a bit confusing and 4596 should, perhaps, be changed), or 4597 new_dest_sec 4598 where 4599 new_dest_sec == output_section->vma + output_offset 4600 We arrange for this to happen by setting RELOCATION to 4601 new_dest_sec + old_src_sec - old_dest_sec 4602 4603 If this is not a PC relative reloc, then R_ADDEND is 4604 simply the VMA of the destination, so we set 4605 RELOCATION to the change in the destination VMA, or 4606 new_dest_sec - old_dest_sec 4607 */ 4608 relocation = (r_section->output_section->vma 4609 + r_section->output_offset 4610 - r_section->vma); 4611 if (howto_table_ext[r_type].pc_relative) 4612 relocation += input_section->vma; 4613 } 4614 4615 if (check_dynamic_reloc != NULL) 4616 { 4617 bfd_boolean skip; 4618 4619 if (! ((*check_dynamic_reloc) 4620 (flaginfo->info, input_bfd, input_section, h, 4621 (void *) rel, contents, &skip, &relocation))) 4622 return FALSE; 4623 if (skip) 4624 continue; 4625 } 4626 4627 /* Now warn if a global symbol is undefined. We could not 4628 do this earlier, because check_dynamic_reloc might want 4629 to skip this reloc. */ 4630 if (hundef 4631 && ! bfd_link_pic (flaginfo->info) 4632 && r_type != (unsigned int) RELOC_BASE10 4633 && r_type != (unsigned int) RELOC_BASE13 4634 && r_type != (unsigned int) RELOC_BASE22) 4635 { 4636 const char *name; 4637 4638 if (h != NULL) 4639 name = h->root.root.string; 4640 else 4641 name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); 4642 (*flaginfo->info->callbacks->undefined_symbol) 4643 (flaginfo->info, name, input_bfd, input_section, r_addr, TRUE); 4644 } 4645 4646 if (r_type != (unsigned int) RELOC_SPARC_REV32) 4647 r = MY_final_link_relocate (howto_table_ext + r_type, 4648 input_bfd, input_section, 4649 contents, r_addr, relocation, 4650 r_addend); 4651 else 4652 { 4653 bfd_vma x; 4654 4655 x = bfd_get_32 (input_bfd, contents + r_addr); 4656 x = x + relocation + r_addend; 4657 bfd_putl32 (/*input_bfd,*/ x, contents + r_addr); 4658 r = bfd_reloc_ok; 4659 } 4660 4661 if (r != bfd_reloc_ok) 4662 { 4663 switch (r) 4664 { 4665 default: 4666 case bfd_reloc_outofrange: 4667 abort (); 4668 case bfd_reloc_overflow: 4669 { 4670 const char *name; 4671 4672 if (h != NULL) 4673 name = NULL; 4674 else if (r_extern 4675 || r_type == (unsigned int) RELOC_BASE10 4676 || r_type == (unsigned int) RELOC_BASE13 4677 || r_type == (unsigned int) RELOC_BASE22) 4678 name = strings + GET_WORD (input_bfd, 4679 syms[r_index].e_strx); 4680 else 4681 { 4682 asection *s; 4683 4684 s = aout_reloc_index_to_section (input_bfd, r_index); 4685 name = bfd_section_name (input_bfd, s); 4686 } 4687 (*flaginfo->info->callbacks->reloc_overflow) 4688 (flaginfo->info, (h ? &h->root : NULL), name, 4689 howto_table_ext[r_type].name, 4690 r_addend, input_bfd, input_section, r_addr); 4691 } 4692 break; 4693 } 4694 } 4695 } 4696 } 4697 4698 return TRUE; 4699 } 4700 4701 /* Link an a.out section into the output file. */ 4702 4703 static bfd_boolean 4704 aout_link_input_section (struct aout_final_link_info *flaginfo, 4705 bfd *input_bfd, 4706 asection *input_section, 4707 file_ptr *reloff_ptr, 4708 bfd_size_type rel_size) 4709 { 4710 bfd_size_type input_size; 4711 void * relocs; 4712 4713 /* Get the section contents. */ 4714 input_size = input_section->size; 4715 if (! bfd_get_section_contents (input_bfd, input_section, 4716 (void *) flaginfo->contents, 4717 (file_ptr) 0, input_size)) 4718 return FALSE; 4719 4720 /* Read in the relocs if we haven't already done it. */ 4721 if (aout_section_data (input_section) != NULL 4722 && aout_section_data (input_section)->relocs != NULL) 4723 relocs = aout_section_data (input_section)->relocs; 4724 else 4725 { 4726 relocs = flaginfo->relocs; 4727 if (rel_size > 0) 4728 { 4729 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0 4730 || bfd_bread (relocs, rel_size, input_bfd) != rel_size) 4731 return FALSE; 4732 } 4733 } 4734 4735 /* Relocate the section contents. */ 4736 if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE) 4737 { 4738 if (! aout_link_input_section_std (flaginfo, input_bfd, input_section, 4739 (struct reloc_std_external *) relocs, 4740 rel_size, flaginfo->contents)) 4741 return FALSE; 4742 } 4743 else 4744 { 4745 if (! aout_link_input_section_ext (flaginfo, input_bfd, input_section, 4746 (struct reloc_ext_external *) relocs, 4747 rel_size, flaginfo->contents)) 4748 return FALSE; 4749 } 4750 4751 /* Write out the section contents. */ 4752 if (! bfd_set_section_contents (flaginfo->output_bfd, 4753 input_section->output_section, 4754 (void *) flaginfo->contents, 4755 (file_ptr) input_section->output_offset, 4756 input_size)) 4757 return FALSE; 4758 4759 /* If we are producing relocatable output, the relocs were 4760 modified, and we now write them out. */ 4761 if (bfd_link_relocatable (flaginfo->info) && rel_size > 0) 4762 { 4763 if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0) 4764 return FALSE; 4765 if (bfd_bwrite (relocs, rel_size, flaginfo->output_bfd) != rel_size) 4766 return FALSE; 4767 *reloff_ptr += rel_size; 4768 4769 /* Assert that the relocs have not run into the symbols, and 4770 that if these are the text relocs they have not run into the 4771 data relocs. */ 4772 BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd) 4773 && (reloff_ptr != &flaginfo->treloff 4774 || (*reloff_ptr 4775 <= obj_datasec (flaginfo->output_bfd)->rel_filepos))); 4776 } 4777 4778 return TRUE; 4779 } 4780 4781 /* Adjust and write out the symbols for an a.out file. Set the new 4782 symbol indices into a symbol_map. */ 4783 4784 static bfd_boolean 4785 aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd) 4786 { 4787 bfd *output_bfd; 4788 bfd_size_type sym_count; 4789 char *strings; 4790 enum bfd_link_strip strip; 4791 enum bfd_link_discard discard; 4792 struct external_nlist *outsym; 4793 bfd_size_type strtab_index; 4794 struct external_nlist *sym; 4795 struct external_nlist *sym_end; 4796 struct aout_link_hash_entry **sym_hash; 4797 int *symbol_map; 4798 bfd_boolean pass; 4799 bfd_boolean skip_next; 4800 4801 output_bfd = flaginfo->output_bfd; 4802 sym_count = obj_aout_external_sym_count (input_bfd); 4803 strings = obj_aout_external_strings (input_bfd); 4804 strip = flaginfo->info->strip; 4805 discard = flaginfo->info->discard; 4806 outsym = flaginfo->output_syms; 4807 4808 /* First write out a symbol for this object file, unless we are 4809 discarding such symbols. */ 4810 if (strip != strip_all 4811 && (strip != strip_some 4812 || bfd_hash_lookup (flaginfo->info->keep_hash, input_bfd->filename, 4813 FALSE, FALSE) != NULL) 4814 && discard != discard_all) 4815 { 4816 H_PUT_8 (output_bfd, N_TEXT, outsym->e_type); 4817 H_PUT_8 (output_bfd, 0, outsym->e_other); 4818 H_PUT_16 (output_bfd, 0, outsym->e_desc); 4819 strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab, 4820 input_bfd->filename, FALSE); 4821 if (strtab_index == (bfd_size_type) -1) 4822 return FALSE; 4823 PUT_WORD (output_bfd, strtab_index, outsym->e_strx); 4824 PUT_WORD (output_bfd, 4825 (bfd_get_section_vma (output_bfd, 4826 obj_textsec (input_bfd)->output_section) 4827 + obj_textsec (input_bfd)->output_offset), 4828 outsym->e_value); 4829 ++obj_aout_external_sym_count (output_bfd); 4830 ++outsym; 4831 } 4832 4833 pass = FALSE; 4834 skip_next = FALSE; 4835 sym = obj_aout_external_syms (input_bfd); 4836 sym_end = sym + sym_count; 4837 sym_hash = obj_aout_sym_hashes (input_bfd); 4838 symbol_map = flaginfo->symbol_map; 4839 memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map); 4840 for (; sym < sym_end; sym++, sym_hash++, symbol_map++) 4841 { 4842 const char *name; 4843 int type; 4844 struct aout_link_hash_entry *h; 4845 bfd_boolean skip; 4846 asection *symsec; 4847 bfd_vma val = 0; 4848 bfd_boolean copy; 4849 4850 /* We set *symbol_map to 0 above for all symbols. If it has 4851 already been set to -1 for this symbol, it means that we are 4852 discarding it because it appears in a duplicate header file. 4853 See the N_BINCL code below. */ 4854 if (*symbol_map == -1) 4855 continue; 4856 4857 /* Initialize *symbol_map to -1, which means that the symbol was 4858 not copied into the output file. We will change it later if 4859 we do copy the symbol over. */ 4860 *symbol_map = -1; 4861 4862 type = H_GET_8 (input_bfd, sym->e_type); 4863 name = strings + GET_WORD (input_bfd, sym->e_strx); 4864 4865 h = NULL; 4866 4867 if (pass) 4868 { 4869 /* Pass this symbol through. It is the target of an 4870 indirect or warning symbol. */ 4871 val = GET_WORD (input_bfd, sym->e_value); 4872 pass = FALSE; 4873 } 4874 else if (skip_next) 4875 { 4876 /* Skip this symbol, which is the target of an indirect 4877 symbol that we have changed to no longer be an indirect 4878 symbol. */ 4879 skip_next = FALSE; 4880 continue; 4881 } 4882 else 4883 { 4884 struct aout_link_hash_entry *hresolve; 4885 4886 /* We have saved the hash table entry for this symbol, if 4887 there is one. Note that we could just look it up again 4888 in the hash table, provided we first check that it is an 4889 external symbol. */ 4890 h = *sym_hash; 4891 4892 /* Use the name from the hash table, in case the symbol was 4893 wrapped. */ 4894 if (h != NULL 4895 && h->root.type != bfd_link_hash_warning) 4896 name = h->root.root.string; 4897 4898 /* If this is an indirect or warning symbol, then change 4899 hresolve to the base symbol. We also change *sym_hash so 4900 that the relocation routines relocate against the real 4901 symbol. */ 4902 hresolve = h; 4903 if (h != (struct aout_link_hash_entry *) NULL 4904 && (h->root.type == bfd_link_hash_indirect 4905 || h->root.type == bfd_link_hash_warning)) 4906 { 4907 hresolve = (struct aout_link_hash_entry *) h->root.u.i.link; 4908 while (hresolve->root.type == bfd_link_hash_indirect 4909 || hresolve->root.type == bfd_link_hash_warning) 4910 hresolve = ((struct aout_link_hash_entry *) 4911 hresolve->root.u.i.link); 4912 *sym_hash = hresolve; 4913 } 4914 4915 /* If the symbol has already been written out, skip it. */ 4916 if (h != NULL 4917 && h->written) 4918 { 4919 if ((type & N_TYPE) == N_INDR 4920 || type == N_WARNING) 4921 skip_next = TRUE; 4922 *symbol_map = h->indx; 4923 continue; 4924 } 4925 4926 /* See if we are stripping this symbol. */ 4927 skip = FALSE; 4928 switch (strip) 4929 { 4930 case strip_none: 4931 break; 4932 case strip_debugger: 4933 if ((type & N_STAB) != 0) 4934 skip = TRUE; 4935 break; 4936 case strip_some: 4937 if (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE, FALSE) 4938 == NULL) 4939 skip = TRUE; 4940 break; 4941 case strip_all: 4942 skip = TRUE; 4943 break; 4944 } 4945 if (skip) 4946 { 4947 if (h != NULL) 4948 h->written = TRUE; 4949 continue; 4950 } 4951 4952 /* Get the value of the symbol. */ 4953 if ((type & N_TYPE) == N_TEXT 4954 || type == N_WEAKT) 4955 symsec = obj_textsec (input_bfd); 4956 else if ((type & N_TYPE) == N_DATA 4957 || type == N_WEAKD) 4958 symsec = obj_datasec (input_bfd); 4959 else if ((type & N_TYPE) == N_BSS 4960 || type == N_WEAKB) 4961 symsec = obj_bsssec (input_bfd); 4962 else if ((type & N_TYPE) == N_ABS 4963 || type == N_WEAKA) 4964 symsec = bfd_abs_section_ptr; 4965 else if (((type & N_TYPE) == N_INDR 4966 && (hresolve == NULL 4967 || (hresolve->root.type != bfd_link_hash_defined 4968 && hresolve->root.type != bfd_link_hash_defweak 4969 && hresolve->root.type != bfd_link_hash_common))) 4970 || type == N_WARNING) 4971 { 4972 /* Pass the next symbol through unchanged. The 4973 condition above for indirect symbols is so that if 4974 the indirect symbol was defined, we output it with 4975 the correct definition so the debugger will 4976 understand it. */ 4977 pass = TRUE; 4978 val = GET_WORD (input_bfd, sym->e_value); 4979 symsec = NULL; 4980 } 4981 else if ((type & N_STAB) != 0) 4982 { 4983 val = GET_WORD (input_bfd, sym->e_value); 4984 symsec = NULL; 4985 } 4986 else 4987 { 4988 /* If we get here with an indirect symbol, it means that 4989 we are outputting it with a real definition. In such 4990 a case we do not want to output the next symbol, 4991 which is the target of the indirection. */ 4992 if ((type & N_TYPE) == N_INDR) 4993 skip_next = TRUE; 4994 4995 symsec = NULL; 4996 4997 /* We need to get the value from the hash table. We use 4998 hresolve so that if we have defined an indirect 4999 symbol we output the final definition. */ 5000 if (h == NULL) 5001 { 5002 switch (type & N_TYPE) 5003 { 5004 case N_SETT: 5005 symsec = obj_textsec (input_bfd); 5006 break; 5007 case N_SETD: 5008 symsec = obj_datasec (input_bfd); 5009 break; 5010 case N_SETB: 5011 symsec = obj_bsssec (input_bfd); 5012 break; 5013 case N_SETA: 5014 symsec = bfd_abs_section_ptr; 5015 break; 5016 default: 5017 val = 0; 5018 break; 5019 } 5020 } 5021 else if (hresolve->root.type == bfd_link_hash_defined 5022 || hresolve->root.type == bfd_link_hash_defweak) 5023 { 5024 asection *input_section; 5025 asection *output_section; 5026 5027 /* This case usually means a common symbol which was 5028 turned into a defined symbol. */ 5029 input_section = hresolve->root.u.def.section; 5030 output_section = input_section->output_section; 5031 BFD_ASSERT (bfd_is_abs_section (output_section) 5032 || output_section->owner == output_bfd); 5033 val = (hresolve->root.u.def.value 5034 + bfd_get_section_vma (output_bfd, output_section) 5035 + input_section->output_offset); 5036 5037 /* Get the correct type based on the section. If 5038 this is a constructed set, force it to be 5039 globally visible. */ 5040 if (type == N_SETT 5041 || type == N_SETD 5042 || type == N_SETB 5043 || type == N_SETA) 5044 type |= N_EXT; 5045 5046 type &=~ N_TYPE; 5047 5048 if (output_section == obj_textsec (output_bfd)) 5049 type |= (hresolve->root.type == bfd_link_hash_defined 5050 ? N_TEXT 5051 : N_WEAKT); 5052 else if (output_section == obj_datasec (output_bfd)) 5053 type |= (hresolve->root.type == bfd_link_hash_defined 5054 ? N_DATA 5055 : N_WEAKD); 5056 else if (output_section == obj_bsssec (output_bfd)) 5057 type |= (hresolve->root.type == bfd_link_hash_defined 5058 ? N_BSS 5059 : N_WEAKB); 5060 else 5061 type |= (hresolve->root.type == bfd_link_hash_defined 5062 ? N_ABS 5063 : N_WEAKA); 5064 } 5065 else if (hresolve->root.type == bfd_link_hash_common) 5066 val = hresolve->root.u.c.size; 5067 else if (hresolve->root.type == bfd_link_hash_undefweak) 5068 { 5069 val = 0; 5070 type = N_WEAKU; 5071 } 5072 else 5073 val = 0; 5074 } 5075 if (symsec != NULL) 5076 val = (symsec->output_section->vma 5077 + symsec->output_offset 5078 + (GET_WORD (input_bfd, sym->e_value) 5079 - symsec->vma)); 5080 5081 /* If this is a global symbol set the written flag, and if 5082 it is a local symbol see if we should discard it. */ 5083 if (h != NULL) 5084 { 5085 h->written = TRUE; 5086 h->indx = obj_aout_external_sym_count (output_bfd); 5087 } 5088 else if ((type & N_TYPE) != N_SETT 5089 && (type & N_TYPE) != N_SETD 5090 && (type & N_TYPE) != N_SETB 5091 && (type & N_TYPE) != N_SETA) 5092 { 5093 switch (discard) 5094 { 5095 case discard_none: 5096 case discard_sec_merge: 5097 break; 5098 case discard_l: 5099 if ((type & N_STAB) == 0 5100 && bfd_is_local_label_name (input_bfd, name)) 5101 skip = TRUE; 5102 break; 5103 case discard_all: 5104 skip = TRUE; 5105 break; 5106 } 5107 if (skip) 5108 { 5109 pass = FALSE; 5110 continue; 5111 } 5112 } 5113 5114 /* An N_BINCL symbol indicates the start of the stabs 5115 entries for a header file. We need to scan ahead to the 5116 next N_EINCL symbol, ignoring nesting, adding up all the 5117 characters in the symbol names, not including the file 5118 numbers in types (the first number after an open 5119 parenthesis). */ 5120 if (type == (int) N_BINCL) 5121 { 5122 struct external_nlist *incl_sym; 5123 int nest; 5124 struct aout_link_includes_entry *incl_entry; 5125 struct aout_link_includes_totals *t; 5126 5127 val = 0; 5128 nest = 0; 5129 for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++) 5130 { 5131 int incl_type; 5132 5133 incl_type = H_GET_8 (input_bfd, incl_sym->e_type); 5134 if (incl_type == (int) N_EINCL) 5135 { 5136 if (nest == 0) 5137 break; 5138 --nest; 5139 } 5140 else if (incl_type == (int) N_BINCL) 5141 ++nest; 5142 else if (nest == 0) 5143 { 5144 const char *s; 5145 5146 s = strings + GET_WORD (input_bfd, incl_sym->e_strx); 5147 for (; *s != '\0'; s++) 5148 { 5149 val += *s; 5150 if (*s == '(') 5151 { 5152 /* Skip the file number. */ 5153 ++s; 5154 while (ISDIGIT (*s)) 5155 ++s; 5156 --s; 5157 } 5158 } 5159 } 5160 } 5161 5162 /* If we have already included a header file with the 5163 same value, then replace this one with an N_EXCL 5164 symbol. */ 5165 copy = (bfd_boolean) (! flaginfo->info->keep_memory); 5166 incl_entry = aout_link_includes_lookup (&flaginfo->includes, 5167 name, TRUE, copy); 5168 if (incl_entry == NULL) 5169 return FALSE; 5170 for (t = incl_entry->totals; t != NULL; t = t->next) 5171 if (t->total == val) 5172 break; 5173 if (t == NULL) 5174 { 5175 /* This is the first time we have seen this header 5176 file with this set of stabs strings. */ 5177 t = (struct aout_link_includes_totals *) 5178 bfd_hash_allocate (&flaginfo->includes.root, 5179 sizeof *t); 5180 if (t == NULL) 5181 return FALSE; 5182 t->total = val; 5183 t->next = incl_entry->totals; 5184 incl_entry->totals = t; 5185 } 5186 else 5187 { 5188 int *incl_map; 5189 5190 /* This is a duplicate header file. We must change 5191 it to be an N_EXCL entry, and mark all the 5192 included symbols to prevent outputting them. */ 5193 type = (int) N_EXCL; 5194 5195 nest = 0; 5196 for (incl_sym = sym + 1, incl_map = symbol_map + 1; 5197 incl_sym < sym_end; 5198 incl_sym++, incl_map++) 5199 { 5200 int incl_type; 5201 5202 incl_type = H_GET_8 (input_bfd, incl_sym->e_type); 5203 if (incl_type == (int) N_EINCL) 5204 { 5205 if (nest == 0) 5206 { 5207 *incl_map = -1; 5208 break; 5209 } 5210 --nest; 5211 } 5212 else if (incl_type == (int) N_BINCL) 5213 ++nest; 5214 else if (nest == 0) 5215 *incl_map = -1; 5216 } 5217 } 5218 } 5219 } 5220 5221 /* Copy this symbol into the list of symbols we are going to 5222 write out. */ 5223 H_PUT_8 (output_bfd, type, outsym->e_type); 5224 H_PUT_8 (output_bfd, H_GET_8 (input_bfd, sym->e_other), outsym->e_other); 5225 H_PUT_16 (output_bfd, H_GET_16 (input_bfd, sym->e_desc), outsym->e_desc); 5226 copy = FALSE; 5227 if (! flaginfo->info->keep_memory) 5228 { 5229 /* name points into a string table which we are going to 5230 free. If there is a hash table entry, use that string. 5231 Otherwise, copy name into memory. */ 5232 if (h != NULL) 5233 name = h->root.root.string; 5234 else 5235 copy = TRUE; 5236 } 5237 strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab, 5238 name, copy); 5239 if (strtab_index == (bfd_size_type) -1) 5240 return FALSE; 5241 PUT_WORD (output_bfd, strtab_index, outsym->e_strx); 5242 PUT_WORD (output_bfd, val, outsym->e_value); 5243 *symbol_map = obj_aout_external_sym_count (output_bfd); 5244 ++obj_aout_external_sym_count (output_bfd); 5245 ++outsym; 5246 } 5247 5248 /* Write out the output symbols we have just constructed. */ 5249 if (outsym > flaginfo->output_syms) 5250 { 5251 bfd_size_type outsym_size; 5252 5253 if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0) 5254 return FALSE; 5255 outsym_size = outsym - flaginfo->output_syms; 5256 outsym_size *= EXTERNAL_NLIST_SIZE; 5257 if (bfd_bwrite ((void *) flaginfo->output_syms, outsym_size, output_bfd) 5258 != outsym_size) 5259 return FALSE; 5260 flaginfo->symoff += outsym_size; 5261 } 5262 5263 return TRUE; 5264 } 5265 5266 /* Link an a.out input BFD into the output file. */ 5267 5268 static bfd_boolean 5269 aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd) 5270 { 5271 BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object); 5272 5273 /* If this is a dynamic object, it may need special handling. */ 5274 if ((input_bfd->flags & DYNAMIC) != 0 5275 && aout_backend_info (input_bfd)->link_dynamic_object != NULL) 5276 return ((*aout_backend_info (input_bfd)->link_dynamic_object) 5277 (flaginfo->info, input_bfd)); 5278 5279 /* Get the symbols. We probably have them already, unless 5280 flaginfo->info->keep_memory is FALSE. */ 5281 if (! aout_get_external_symbols (input_bfd)) 5282 return FALSE; 5283 5284 /* Write out the symbols and get a map of the new indices. The map 5285 is placed into flaginfo->symbol_map. */ 5286 if (! aout_link_write_symbols (flaginfo, input_bfd)) 5287 return FALSE; 5288 5289 /* Relocate and write out the sections. These functions use the 5290 symbol map created by aout_link_write_symbols. The linker_mark 5291 field will be set if these sections are to be included in the 5292 link, which will normally be the case. */ 5293 if (obj_textsec (input_bfd)->linker_mark) 5294 { 5295 if (! aout_link_input_section (flaginfo, input_bfd, 5296 obj_textsec (input_bfd), 5297 &flaginfo->treloff, 5298 exec_hdr (input_bfd)->a_trsize)) 5299 return FALSE; 5300 } 5301 if (obj_datasec (input_bfd)->linker_mark) 5302 { 5303 if (! aout_link_input_section (flaginfo, input_bfd, 5304 obj_datasec (input_bfd), 5305 &flaginfo->dreloff, 5306 exec_hdr (input_bfd)->a_drsize)) 5307 return FALSE; 5308 } 5309 5310 /* If we are not keeping memory, we don't need the symbols any 5311 longer. We still need them if we are keeping memory, because the 5312 strings in the hash table point into them. */ 5313 if (! flaginfo->info->keep_memory) 5314 { 5315 if (! aout_link_free_symbols (input_bfd)) 5316 return FALSE; 5317 } 5318 5319 return TRUE; 5320 } 5321 5322 /* Do the final link step. This is called on the output BFD. The 5323 INFO structure should point to a list of BFDs linked through the 5324 link.next field which can be used to find each BFD which takes part 5325 in the output. Also, each section in ABFD should point to a list 5326 of bfd_link_order structures which list all the input sections for 5327 the output section. */ 5328 5329 bfd_boolean 5330 NAME (aout, final_link) (bfd *abfd, 5331 struct bfd_link_info *info, 5332 void (*callback) (bfd *, file_ptr *, file_ptr *, file_ptr *)) 5333 { 5334 struct aout_final_link_info aout_info; 5335 bfd_boolean includes_hash_initialized = FALSE; 5336 bfd *sub; 5337 bfd_size_type trsize, drsize; 5338 bfd_size_type max_contents_size; 5339 bfd_size_type max_relocs_size; 5340 bfd_size_type max_sym_count; 5341 struct bfd_link_order *p; 5342 asection *o; 5343 bfd_boolean have_link_order_relocs; 5344 5345 if (bfd_link_pic (info)) 5346 abfd->flags |= DYNAMIC; 5347 5348 aout_info.info = info; 5349 aout_info.output_bfd = abfd; 5350 aout_info.contents = NULL; 5351 aout_info.relocs = NULL; 5352 aout_info.symbol_map = NULL; 5353 aout_info.output_syms = NULL; 5354 5355 if (!bfd_hash_table_init_n (&aout_info.includes.root, 5356 aout_link_includes_newfunc, 5357 sizeof (struct aout_link_includes_entry), 5358 251)) 5359 goto error_return; 5360 includes_hash_initialized = TRUE; 5361 5362 /* Figure out the largest section size. Also, if generating 5363 relocatable output, count the relocs. */ 5364 trsize = 0; 5365 drsize = 0; 5366 max_contents_size = 0; 5367 max_relocs_size = 0; 5368 max_sym_count = 0; 5369 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) 5370 { 5371 bfd_size_type sz; 5372 5373 if (bfd_link_relocatable (info)) 5374 { 5375 if (bfd_get_flavour (sub) == bfd_target_aout_flavour) 5376 { 5377 trsize += exec_hdr (sub)->a_trsize; 5378 drsize += exec_hdr (sub)->a_drsize; 5379 } 5380 else 5381 { 5382 /* FIXME: We need to identify the .text and .data sections 5383 and call get_reloc_upper_bound and canonicalize_reloc to 5384 work out the number of relocs needed, and then multiply 5385 by the reloc size. */ 5386 (*_bfd_error_handler) 5387 (_("%s: relocatable link from %s to %s not supported"), 5388 bfd_get_filename (abfd), 5389 sub->xvec->name, abfd->xvec->name); 5390 bfd_set_error (bfd_error_invalid_operation); 5391 goto error_return; 5392 } 5393 } 5394 5395 if (bfd_get_flavour (sub) == bfd_target_aout_flavour) 5396 { 5397 sz = obj_textsec (sub)->size; 5398 if (sz > max_contents_size) 5399 max_contents_size = sz; 5400 sz = obj_datasec (sub)->size; 5401 if (sz > max_contents_size) 5402 max_contents_size = sz; 5403 5404 sz = exec_hdr (sub)->a_trsize; 5405 if (sz > max_relocs_size) 5406 max_relocs_size = sz; 5407 sz = exec_hdr (sub)->a_drsize; 5408 if (sz > max_relocs_size) 5409 max_relocs_size = sz; 5410 5411 sz = obj_aout_external_sym_count (sub); 5412 if (sz > max_sym_count) 5413 max_sym_count = sz; 5414 } 5415 } 5416 5417 if (bfd_link_relocatable (info)) 5418 { 5419 if (obj_textsec (abfd) != NULL) 5420 trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd) 5421 ->map_head.link_order) 5422 * obj_reloc_entry_size (abfd)); 5423 if (obj_datasec (abfd) != NULL) 5424 drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd) 5425 ->map_head.link_order) 5426 * obj_reloc_entry_size (abfd)); 5427 } 5428 5429 exec_hdr (abfd)->a_trsize = trsize; 5430 exec_hdr (abfd)->a_drsize = drsize; 5431 5432 exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); 5433 5434 /* Adjust the section sizes and vmas according to the magic number. 5435 This sets a_text, a_data and a_bss in the exec_hdr and sets the 5436 filepos for each section. */ 5437 if (! NAME (aout, adjust_sizes_and_vmas) (abfd)) 5438 goto error_return; 5439 5440 /* The relocation and symbol file positions differ among a.out 5441 targets. We are passed a callback routine from the backend 5442 specific code to handle this. 5443 FIXME: At this point we do not know how much space the symbol 5444 table will require. This will not work for any (nonstandard) 5445 a.out target that needs to know the symbol table size before it 5446 can compute the relocation file positions. This may or may not 5447 be the case for the hp300hpux target, for example. */ 5448 (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff, 5449 &aout_info.symoff); 5450 obj_textsec (abfd)->rel_filepos = aout_info.treloff; 5451 obj_datasec (abfd)->rel_filepos = aout_info.dreloff; 5452 obj_sym_filepos (abfd) = aout_info.symoff; 5453 5454 /* We keep a count of the symbols as we output them. */ 5455 obj_aout_external_sym_count (abfd) = 0; 5456 5457 /* We accumulate the string table as we write out the symbols. */ 5458 aout_info.strtab = _bfd_stringtab_init (); 5459 if (aout_info.strtab == NULL) 5460 goto error_return; 5461 5462 /* Allocate buffers to hold section contents and relocs. */ 5463 aout_info.contents = (bfd_byte *) bfd_malloc (max_contents_size); 5464 aout_info.relocs = bfd_malloc (max_relocs_size); 5465 aout_info.symbol_map = (int *) bfd_malloc (max_sym_count * sizeof (int)); 5466 aout_info.output_syms = (struct external_nlist *) 5467 bfd_malloc ((max_sym_count + 1) * sizeof (struct external_nlist)); 5468 if ((aout_info.contents == NULL && max_contents_size != 0) 5469 || (aout_info.relocs == NULL && max_relocs_size != 0) 5470 || (aout_info.symbol_map == NULL && max_sym_count != 0) 5471 || aout_info.output_syms == NULL) 5472 goto error_return; 5473 5474 /* If we have a symbol named __DYNAMIC, force it out now. This is 5475 required by SunOS. Doing this here rather than in sunos.c is a 5476 hack, but it's easier than exporting everything which would be 5477 needed. */ 5478 { 5479 struct aout_link_hash_entry *h; 5480 5481 h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC", 5482 FALSE, FALSE, FALSE); 5483 if (h != NULL) 5484 aout_link_write_other_symbol (&h->root.root, &aout_info); 5485 } 5486 5487 /* The most time efficient way to do the link would be to read all 5488 the input object files into memory and then sort out the 5489 information into the output file. Unfortunately, that will 5490 probably use too much memory. Another method would be to step 5491 through everything that composes the text section and write it 5492 out, and then everything that composes the data section and write 5493 it out, and then write out the relocs, and then write out the 5494 symbols. Unfortunately, that requires reading stuff from each 5495 input file several times, and we will not be able to keep all the 5496 input files open simultaneously, and reopening them will be slow. 5497 5498 What we do is basically process one input file at a time. We do 5499 everything we need to do with an input file once--copy over the 5500 section contents, handle the relocation information, and write 5501 out the symbols--and then we throw away the information we read 5502 from it. This approach requires a lot of lseeks of the output 5503 file, which is unfortunate but still faster than reopening a lot 5504 of files. 5505 5506 We use the output_has_begun field of the input BFDs to see 5507 whether we have already handled it. */ 5508 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) 5509 sub->output_has_begun = FALSE; 5510 5511 /* Mark all sections which are to be included in the link. This 5512 will normally be every section. We need to do this so that we 5513 can identify any sections which the linker has decided to not 5514 include. */ 5515 for (o = abfd->sections; o != NULL; o = o->next) 5516 { 5517 for (p = o->map_head.link_order; p != NULL; p = p->next) 5518 if (p->type == bfd_indirect_link_order) 5519 p->u.indirect.section->linker_mark = TRUE; 5520 } 5521 5522 have_link_order_relocs = FALSE; 5523 for (o = abfd->sections; o != NULL; o = o->next) 5524 { 5525 for (p = o->map_head.link_order; 5526 p != NULL; 5527 p = p->next) 5528 { 5529 if (p->type == bfd_indirect_link_order 5530 && (bfd_get_flavour (p->u.indirect.section->owner) 5531 == bfd_target_aout_flavour)) 5532 { 5533 bfd *input_bfd; 5534 5535 input_bfd = p->u.indirect.section->owner; 5536 if (! input_bfd->output_has_begun) 5537 { 5538 if (! aout_link_input_bfd (&aout_info, input_bfd)) 5539 goto error_return; 5540 input_bfd->output_has_begun = TRUE; 5541 } 5542 } 5543 else if (p->type == bfd_section_reloc_link_order 5544 || p->type == bfd_symbol_reloc_link_order) 5545 { 5546 /* These are handled below. */ 5547 have_link_order_relocs = TRUE; 5548 } 5549 else 5550 { 5551 if (! _bfd_default_link_order (abfd, info, o, p)) 5552 goto error_return; 5553 } 5554 } 5555 } 5556 5557 /* Write out any symbols that we have not already written out. */ 5558 bfd_hash_traverse (&info->hash->table, 5559 aout_link_write_other_symbol, 5560 &aout_info); 5561 5562 /* Now handle any relocs we were asked to create by the linker. 5563 These did not come from any input file. We must do these after 5564 we have written out all the symbols, so that we know the symbol 5565 indices to use. */ 5566 if (have_link_order_relocs) 5567 { 5568 for (o = abfd->sections; o != NULL; o = o->next) 5569 { 5570 for (p = o->map_head.link_order; 5571 p != NULL; 5572 p = p->next) 5573 { 5574 if (p->type == bfd_section_reloc_link_order 5575 || p->type == bfd_symbol_reloc_link_order) 5576 { 5577 if (! aout_link_reloc_link_order (&aout_info, o, p)) 5578 goto error_return; 5579 } 5580 } 5581 } 5582 } 5583 5584 if (aout_info.contents != NULL) 5585 { 5586 free (aout_info.contents); 5587 aout_info.contents = NULL; 5588 } 5589 if (aout_info.relocs != NULL) 5590 { 5591 free (aout_info.relocs); 5592 aout_info.relocs = NULL; 5593 } 5594 if (aout_info.symbol_map != NULL) 5595 { 5596 free (aout_info.symbol_map); 5597 aout_info.symbol_map = NULL; 5598 } 5599 if (aout_info.output_syms != NULL) 5600 { 5601 free (aout_info.output_syms); 5602 aout_info.output_syms = NULL; 5603 } 5604 if (includes_hash_initialized) 5605 { 5606 bfd_hash_table_free (&aout_info.includes.root); 5607 includes_hash_initialized = FALSE; 5608 } 5609 5610 /* Finish up any dynamic linking we may be doing. */ 5611 if (aout_backend_info (abfd)->finish_dynamic_link != NULL) 5612 { 5613 if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info)) 5614 goto error_return; 5615 } 5616 5617 /* Update the header information. */ 5618 abfd->symcount = obj_aout_external_sym_count (abfd); 5619 exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE; 5620 obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms; 5621 obj_textsec (abfd)->reloc_count = 5622 exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd); 5623 obj_datasec (abfd)->reloc_count = 5624 exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd); 5625 5626 /* Write out the string table, unless there are no symbols. */ 5627 if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0) 5628 goto error_return; 5629 if (abfd->symcount > 0) 5630 { 5631 if (!emit_stringtab (abfd, aout_info.strtab)) 5632 goto error_return; 5633 } 5634 else 5635 { 5636 bfd_byte b[BYTES_IN_WORD]; 5637 5638 memset (b, 0, BYTES_IN_WORD); 5639 if (bfd_bwrite (b, (bfd_size_type) BYTES_IN_WORD, abfd) != BYTES_IN_WORD) 5640 goto error_return; 5641 } 5642 5643 return TRUE; 5644 5645 error_return: 5646 if (aout_info.contents != NULL) 5647 free (aout_info.contents); 5648 if (aout_info.relocs != NULL) 5649 free (aout_info.relocs); 5650 if (aout_info.symbol_map != NULL) 5651 free (aout_info.symbol_map); 5652 if (aout_info.output_syms != NULL) 5653 free (aout_info.output_syms); 5654 if (includes_hash_initialized) 5655 bfd_hash_table_free (&aout_info.includes.root); 5656 return FALSE; 5657 } 5658