diff options
author | Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> | 2010-03-05 19:49:00 +0000 |
---|---|---|
committer | Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> | 2010-03-05 19:49:00 +0000 |
commit | a6cc6b3bc4d8f33c24473b6e7c5fc3ea1f1ac998 (patch) | |
tree | 65dbce5f1d188f21bf09555994a129c2731cb6ac /bfd | |
parent | 4e7386b0c714425b9c1ac212ecc861297e581b19 (diff) | |
download | gdb-a6cc6b3bc4d8f33c24473b6e7c5fc3ea1f1ac998.zip gdb-a6cc6b3bc4d8f33c24473b6e7c5fc3ea1f1ac998.tar.gz gdb-a6cc6b3bc4d8f33c24473b6e7c5fc3ea1f1ac998.tar.bz2 |
ld:
* Makefile.am (ALL_EMULATIONS): Add eelf32_sparc_sol2.o,
eelf_i386_sol2.o.
(ALL_64_EMULATIONS): Add eelf_x86_64_sol2.o, eelf64_sparc_sol2.o.
(eelf32_sparc_sol2.c): New rule.
(eelf64_sparc_sol2.c): Likewise.
(eelf_x86_64_sol2.c): Likewise.
(eelf_i386_sol2.c): Likewise.
* Makefile.in: Regenerate.
* configure.tgt (i[3-7]86-*-solaris2*): Change targ_emul to
elf_i386_sol2.
Add elf_i386_ldso, elf_x86_64_sol2 to targ_extra_emuls.
(x86_64-*-solaris2*): Change targ_emul to elf_x86_64_sol2.
Add elf_x86_64, elf_i386_sol2, elf_i386 to targ_extra_emuls.
(sparc-*-solaris2.[0-6]*): Change targ_emul to elf32_sparc_sol2.
Add target_extra_emuls.
(sparc-*-solaris2*): Change targ_emul to elf32_sparc_sol2.
Add elf32_sparc, elf64_sparc_sol2 to targ_extra_emuls.
(sparcv9-*-solaris2*): Change targ_emul to elf64_sparc_sol2.
Add elf64_sparc, elf32_sparc_sol2 to target_extra_emuls.
* emulparams/elf32_sparc_sol2.sh: New file.
* emulparams/elf64_sparc_sol2.sh: New file.
* emulparams/elf_i386_sol2.sh: New file.
* emulparams/elf_x86_64_sol2.sh: New file.
* emultempl/solaris2.em: New file.
bfd:
* 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.
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, |