From: Ian Lance Taylor Date: Thu, 9 Mar 1995 20:14:04 +0000 (+0000) Subject: * aoutx.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter, X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2f6754271fb72b83ce24ea3c66e4236dee7abb2c;p=binutils-gdb.git * aoutx.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter, and use it instead of bfd_get_symcount. Check r_index after setting r_extern based on whether this is a base relative reloc. (NAME(aout,swap_std_reloc_IN)): Add symcount parameter, and use it instead of bfd_get_symcount. (NAME(aout,slurp_reloc_table)): Pass bfd_get_symcount to reloc swap routines. * libaout.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter to declaration. (NAME(aout,swap_std_reloc_in)): Likewise. * sunos.c (sunos_canonicalize_dynamic_reloc): Pass info->dynsym_count to reloc swap routines. * aout-ns32k.c (MY_swap_std_reloc_in): Add symcount parameter. * hp300hpux.c (MY(swap_std_reloc_in)): Likewise. (MY(slurp_reloc_table)): Pass bfd_get_symcount to reloc swap routine. * i386lynx.c (NAME(lynx,swap_ext_reloc_in)): Add symcount parameter. (NAME(lynx,swap_std_reloc_in)): Likewise. (NAME(lynx,slurp_reloc_table)): Pass bfd_get_symcount to reloc swap routines. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 16def8ed82e..c9eafececac 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,64 @@ +Thu Mar 9 15:06:25 1995 Ian Lance Taylor + + * aoutx.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter, + and use it instead of bfd_get_symcount. Check r_index after + setting r_extern based on whether this is a base relative reloc. + (NAME(aout,swap_std_reloc_IN)): Add symcount parameter, and use it + instead of bfd_get_symcount. + (NAME(aout,slurp_reloc_table)): Pass bfd_get_symcount to reloc + swap routines. + * libaout.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter + to declaration. + (NAME(aout,swap_std_reloc_in)): Likewise. + * sunos.c (sunos_canonicalize_dynamic_reloc): Pass + info->dynsym_count to reloc swap routines. + * aout-ns32k.c (MY_swap_std_reloc_in): Add symcount parameter. + * hp300hpux.c (MY(swap_std_reloc_in)): Likewise. + (MY(slurp_reloc_table)): Pass bfd_get_symcount to reloc swap + routine. + * i386lynx.c (NAME(lynx,swap_ext_reloc_in)): Add symcount + parameter. + (NAME(lynx,swap_std_reloc_in)): Likewise. + (NAME(lynx,slurp_reloc_table)): Pass bfd_get_symcount to reloc + swap routines. + +Thu Mar 9 12:04:05 1995 Michael Meissner + + * bfd.c (bfd_merge_private_bfd_data): New function vector to be + called by the linker to merge any private bfd data of the input + files and the output file. Used by the PowerPC ELF support to + check whether -mrelocatable is used for all modules. + (bfd_set_private_flags): New function vector to be called by the + assembler to set private flags. Used by the PowerPC ELF support + to set that a particular object file was assembled with the + -mrelocatable option. + + * targets.c (BFD_JUMP_TABLE_COPY): Add intiialization of the + bfd_merge_private_bfd_data and bfd_set_private_flags function + vectors. + + * bfd-in2.h, libbfd-in.h: Rebuild with bfd.c and targets.c + changes. + + * elf32-ppc.c (ppc_elf_set_private_flags): New function to set the + ELF e_flags field. + (ppc_elf_copy_private_bfd_data): Copy the e_flags field from the + input file to the output file. + (ppc_elf_merge_private_bfd_data): Check for a mismatch between the + e_flags field of all of the linker input files. + + * libelf.h (elf_obj_tdata): Add ppc_flags_init field so that the + PowerPC support can check if compataible e_flags are present. + + * aout-target.h: Add NOP for the bfd_merge_private_bfd_data + and bfd_set_private_flags function vectors. + * coffcode.h: Ditto. + * elf32-target.h: Ditto. + * elf64-target.h: Ditto. + * libbfd.h: Ditto. + * libecoff.h: Ditto. + * som.c: Ditto. + Wed Mar 8 00:53:54 1995 Ian Lance Taylor * cpu-mips.c (arch_info_struct): Add mips:8000 entry. diff --git a/bfd/aoutx.h b/bfd/aoutx.h index 5c33fd3e5f4..b3c660e2405 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -2116,11 +2116,12 @@ NAME(aout,swap_ext_reloc_out) (abfd, g, natptr) } \ void -NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols) +NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) bfd *abfd; struct reloc_ext_external *bytes; arelent *cache_ptr; asymbol **symbols; + bfd_size_type symcount; { int r_index; int r_extern; @@ -2146,7 +2147,17 @@ NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols) >> RELOC_EXT_BITS_TYPE_SH_LITTLE; } - if (r_extern && r_index > bfd_get_symcount (abfd)) + cache_ptr->howto = howto_table_ext + r_type; + + /* Base relative relocs are always against the symbol table, + regardless of the setting of r_extern. r_extern just reflects + whether the symbol the reloc is against is local or global. */ + if (r_type == RELOC_BASE10 + || r_type == RELOC_BASE13 + || r_type == RELOC_BASE22) + r_extern = 1; + + if (r_extern && r_index > symcount) { /* We could arrange to return an error, but it might be useful to see the file even if it is bad. */ @@ -2154,16 +2165,16 @@ NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols) r_index = N_ABS; } - cache_ptr->howto = howto_table_ext + r_type; MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend)); } void -NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols) +NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) bfd *abfd; struct reloc_std_external *bytes; arelent *cache_ptr; asymbol **symbols; + bfd_size_type symcount; { int r_index; int r_extern; @@ -2206,7 +2217,13 @@ NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols) cache_ptr->howto = howto_table_std + howto_idx; BFD_ASSERT (cache_ptr->howto->type != -1); - if (r_extern && r_index > bfd_get_symcount (abfd)) + /* Base relative relocs are always against the symbol table, + regardless of the setting of r_extern. r_extern just reflects + whether the symbol the reloc is against is local or global. */ + if (r_baserel) + r_extern = 1; + + if (r_extern && r_index > symcount) { /* We could arrange to return an error, but it might be useful to see the file even if it is bad. */ @@ -2288,7 +2305,8 @@ NAME(aout,slurp_reloc_table) (abfd, asect, symbols) (struct reloc_ext_external *) relocs; for (; counter < count; counter++, rptr++, cache_ptr++) - NAME(aout,swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols); + NAME(aout,swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols, + bfd_get_symcount (abfd)); } else { @@ -2296,7 +2314,8 @@ NAME(aout,slurp_reloc_table) (abfd, asect, symbols) (struct reloc_std_external *) relocs; for (; counter < count; counter++, rptr++, cache_ptr++) - MY_swap_std_reloc_in(abfd, rptr, cache_ptr, symbols); + MY_swap_std_reloc_in (abfd, rptr, cache_ptr, symbols, + bfd_get_symcount (abfd)); } free (relocs);