diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 35 | ||||
-rw-r--r-- | bfd/config.bfd | 10 | ||||
-rwxr-xr-x | bfd/configure | 2 | ||||
-rw-r--r-- | bfd/configure.in | 2 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 23 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 23 | ||||
-rw-r--r-- | bfd/elflink.c | 18 | ||||
-rw-r--r-- | bfd/targets.c | 4 |
8 files changed, 110 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 98e14e7..201e132 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,38 @@ +2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * elflink.c (bfd_elf_size_dynamic_sections): Don't emit base + version twice. + Skip it when constructing def.vd_next. + + * elf32-i386.c (TARGET_LITTLE_SYM): Redefine to + bfd_elf32_i386_sol2_vec. + (TARGET_LITTLE_NAME): Redefine to elf32-i386-sol2. + (elf32_bed): Redefine to elf32_i386_sol2_bed. + (elf_backend_want_plt_sym): Redefine to 1. + + * elf64-x86-64.c (TARGET_LITTLE_SYM): Redefine to + bfd_elf64_x86_64_sol2_vec. + (TARGET_LITTLE_NAME): Redefine to elf64-x86-64-sol2. + (elf64_bed): Redefine to elf64_x86_64_sol2_bed. + (elf_backend_want_plt_sym): Redefine to 1. + + * config.bfd (i[3-7]86-*-solaris2*): Set targ_defvec to + bfd_elf32_i386_sol2_vec. + Replace bfd_elf64_x86_64_vec by bfd_elf64_x86_64_sol2_vec in + targ64_selvecs. + (x86_64-*-solaris2*): Set targ_defvec to bfd_elf32_i386_sol2_vec. + Replace bfd_elf64_x86_64_vec by bfd_elf64_x86_64_sol2_vec in + targ_selvecs. + + * configure.in: Handle bfd_elf32_i386_sol2_vec, + bfd_elf64_x86_64_sol2_vec. + * configure: Regenerate. + + * targets.c (bfd_elf32_i386_sol2_vec): Declare. + (bfd_elf64_x86_64_sol2_vec): Declare. + (_bfd_target_vector): Add bfd_elf32_i386_sol2_vec, + bfd_elf64_x86_64_sol2_vec. + 2010-03-04 Daniel Jacobowitz <dan@codesourcery.com> * elf32-arm.c (elf32_arm_output_arch_local_syms): Skip non-program diff --git a/bfd/config.bfd b/bfd/config.bfd index 9290b83..0ec4001 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -499,15 +499,15 @@ case "${targ}" in targ_selvecs=i386coff_vec ;; i[3-7]86-*-solaris2*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs=i386coff_vec - targ64_selvecs="bfd_elf64_x86_64_vec bfd_elf64_l1om_vec" + targ_defvec=bfd_elf32_i386_sol2_vec + targ_selvecs="i386coff_vec" + targ64_selvecs="bfd_elf64_x86_64_sol2_vec bfd_elf64_l1om_vec" want64=true ;; #ifdef BFD64 x86_64-*-solaris2*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs="bfd_elf64_x86_64_vec bfd_elf64_l1om_vec i386coff_vec" + targ_defvec=bfd_elf32_i386_sol2_vec + targ_selvecs="bfd_elf64_x86_64_sol2_vec bfd_elf64_l1om_vec i386coff_vec" want64=true ;; #endif diff --git a/bfd/configure b/bfd/configure index 5ee3ffd..f375398 100755 --- a/bfd/configure +++ b/bfd/configure @@ -15028,6 +15028,7 @@ do bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;; bfd_elf32_i386_dragonfly_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; + bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; @@ -15141,6 +15142,7 @@ do bfd_elf64_tradbigmips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf64_tradlittlemips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; diff --git a/bfd/configure.in b/bfd/configure.in index b246afc..e626dba 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -687,6 +687,7 @@ do bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;; bfd_elf32_i386_dragonfly_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; + bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;; @@ -800,6 +801,7 @@ do bfd_elf64_tradbigmips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf64_tradlittlemips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 6ec2c2e..6872072 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -4719,6 +4719,29 @@ elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info) #include "elf32-target.h" +/* Solaris 2. */ + +#undef TARGET_LITTLE_SYM +#define TARGET_LITTLE_SYM bfd_elf32_i386_sol2_vec +#undef TARGET_LITTLE_NAME +#define TARGET_LITTLE_NAME "elf32-i386-sol2" + +/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE + objects won't be recognized. */ +#undef ELF_OSABI + +#undef elf32_bed +#define elf32_bed elf32_i386_sol2_bed + +/* The Solaris 2 ABI requires a plt symbol on all platforms. + + Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output + File, p.63. */ +#undef elf_backend_want_plt_sym +#define elf_backend_want_plt_sym 1 + +#include "elf32-target.h" + /* VxWorks support. */ #undef TARGET_LITTLE_SYM diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 82a869a..8051813 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -4510,6 +4510,29 @@ static const struct bfd_elf_special_section #include "elf64-target.h" +/* Solaris 2 support. */ + +#undef TARGET_LITTLE_SYM +#define TARGET_LITTLE_SYM bfd_elf64_x86_64_sol2_vec +#undef TARGET_LITTLE_NAME +#define TARGET_LITTLE_NAME "elf64-x86-64-sol2" + +/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE + objects won't be recognized. */ +#undef ELF_OSABI + +#undef elf64_bed +#define elf64_bed elf64_x86_64_sol2_bed + +/* The Solaris 2 ABI requires a plt symbol on all platforms. + + Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output + File, p.63. */ +#undef elf_backend_want_plt_sym +#define elf_backend_want_plt_sym 1 + +#include "elf64-target.h" + /* Intel L1OM support. */ static bfd_boolean diff --git a/bfd/elflink.c b/bfd/elflink.c index 9fb347b..8f6b5f4 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5946,6 +5946,10 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, { struct bfd_elf_version_deps *n; + /* Don't emit base version twice. */ + if (t->vernum == 0) + continue; + size += sizeof (Elf_External_Verdef); size += sizeof (Elf_External_Verdaux); ++cdefs; @@ -6045,6 +6049,10 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, unsigned int cdeps; struct bfd_elf_version_deps *n; + /* Don't emit the base version twice. */ + if (t->vernum == 0) + continue; + cdeps = 0; for (n = t->deps; n != NULL; n = n->next) ++cdeps; @@ -6076,7 +6084,13 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, def.vd_hash = bfd_elf_hash (t->name); def.vd_aux = sizeof (Elf_External_Verdef); def.vd_next = 0; - if (t->next != NULL) + + /* If a basever node is next, it *must* be the last node in + the chain, otherwise Verdef construction breaks. */ + if (t->next != NULL && t->next->vernum == 0) + BFD_ASSERT (t->next->next == NULL); + + if (t->next != NULL && t->next->vernum != 0) def.vd_next = (sizeof (Elf_External_Verdef) + (cdeps + 1) * sizeof (Elf_External_Verdaux)); @@ -6177,7 +6191,7 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, unsigned int crefs; bfd_byte *p; - /* Build the version definition section. */ + /* Build the version dependency section. */ size = 0; crefs = 0; for (t = elf_tdata (output_bfd)->verref; diff --git a/bfd/targets.c b/bfd/targets.c index 726fe77..6042903 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -603,6 +603,7 @@ extern const bfd_target bfd_elf32_hppa_nbsd_vec; extern const bfd_target bfd_elf32_hppa_vec; extern const bfd_target bfd_elf32_i370_vec; extern const bfd_target bfd_elf32_i386_freebsd_vec; +extern const bfd_target bfd_elf32_i386_sol2_vec; extern const bfd_target bfd_elf32_i386_vxworks_vec; extern const bfd_target bfd_elf32_i386_vec; extern const bfd_target bfd_elf32_i860_little_vec; @@ -709,6 +710,7 @@ extern const bfd_target bfd_elf64_sparc_freebsd_vec; extern const bfd_target bfd_elf64_tradbigmips_vec; extern const bfd_target bfd_elf64_tradlittlemips_vec; extern const bfd_target bfd_elf64_x86_64_freebsd_vec; +extern const bfd_target bfd_elf64_x86_64_sol2_vec; extern const bfd_target bfd_elf64_x86_64_vec; extern const bfd_target bfd_elf64_l1om_freebsd_vec; extern const bfd_target bfd_elf64_l1om_vec; @@ -939,6 +941,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_hppa_vec, &bfd_elf32_i370_vec, &bfd_elf32_i386_freebsd_vec, + &bfd_elf32_i386_sol2_vec, &bfd_elf32_i386_vxworks_vec, &bfd_elf32_i386_vec, &bfd_elf32_i860_little_vec, @@ -1054,6 +1057,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf64_tradbigmips_vec, &bfd_elf64_tradlittlemips_vec, &bfd_elf64_x86_64_freebsd_vec, + &bfd_elf64_x86_64_sol2_vec, &bfd_elf64_x86_64_vec, &bfd_elf64_l1om_freebsd_vec, &bfd_elf64_l1om_vec, |