From 3023e3f66a5ac8d0fc159324ea49f9e15bbb2e8f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 16 Apr 2009 23:07:00 +0000 Subject: [PATCH] bfd/ * aout-adobe.c (aout_32_bfd_define_common_symbol): Define. * aout-target.h (MY_bfd_define_common_symbol): Likewise. * aout-tic30.c (MY_bfd_define_common_symbol): Likewise. * binary.c (binary_bfd_define_common_symbol): Likewise. * bout.c (b_out_bfd_define_common_symbol): Likewise. * coff-alpha.c (_bfd_ecoff_bfd_define_common_symbol): Likewise. * coff-mips.c (_bfd_ecoff_bfd_define_common_symbol): Likewise. * coffcode.h (coff_bfd_define_common_symbol): Likewise. * elfxx-target.h (bfd_elfNN_bfd_define_common_symbol): Likewise. * i386msdos.c (msdos_bfd_define_common_symbol): Likewise. * i386os9k.c (os9k_bfd_define_common_symbol): Likewise. * ieee.c (ieee_bfd_define_common_symbol): Likewise. * ihex.c (ihex_bfd_define_common_symbol): Likewise. * libbfd-in.h (_bfd_nolink_bfd_define_common_symbol): Likewise. * mach-o.c (bfd_mach_o_bfd_define_common_symbol): Likewise. * mmo.c (mmo_bfd_define_common_symbol): Likewise. * nlm-target.h (nlm_bfd_define_common_symbol): Likewise. * oasys.c (oasys_bfd_define_common_symbol): Likewise. * pef.c (bfd_pef_bfd_define_common_symbol): Likewise. * ppcboot.c (ppcboot_bfd_define_common_symbol): Likewise. * som.c (som_bfd_define_common_symbol): Likewise. * srec.c (srec_bfd_define_common_symbol): Likewise. * tekhex.c (tekhex_bfd_define_common_symbol): Likewise. * versados.c (versados_bfd_define_common_symbol): Likewise. * vms.c (vms_bfd_define_common_symbol): Likewise. * xcoff-target.h (_bfd_xcoff_bfd_define_common_symbol): Likewise. * xsym.c (bfd_sym_bfd_define_common_symbol): Likewise. * coff-rs6000.c (rs6000coff_vec): Add _bfd_xcoff_define_common_symbol. (pmac_xcoff_vec): Likewise. * coff64-rs6000.c (rs6000coff64_vec): Likewise. (aix5coff64_vec): Likewise. * linker.c (bfd_generic_define_common_symbol): New function. * targets.c (BFD_JUMP_TABLE_LINK): Add NAME##_bfd_define_common_symbol. (_bfd_define_common_symbol): New field. * libcoff-in.h (_bfd_xcoff_define_common_symbol): Declare. * xcofflink.c (_bfd_xcoff_define_common_symbol): New function. (xcoff_build_ldsyms): Don't set XCOFF_DEF_REGULAR for common symbols here. * bfd-in2.h: Regenerate. * libbfd.h: Likewise. * libcoff.h: Likewise. ld/ * ldlang.c (lang_one_common): Use bfd_define_common_symbol. ld/testsuite/ * ld-powerpc/aix-export-2.s, ld-powerpc/aix-export-2.nd: New test. * ld-powerpc/aix52.exp: Run it. --- bfd/ChangeLog | 44 ++++++++++++++++++ bfd/aout-adobe.c | 1 + bfd/aout-target.h | 3 ++ bfd/aout-tic30.c | 3 ++ bfd/bfd-in2.h | 14 +++++- bfd/binary.c | 1 + bfd/bout.c | 1 + bfd/coff-alpha.c | 1 + bfd/coff-mips.c | 1 + bfd/coff-rs6000.c | 2 + bfd/coff64-rs6000.c | 2 + bfd/coffcode.h | 4 ++ bfd/elfxx-target.h | 4 ++ bfd/i386msdos.c | 1 + bfd/i386os9k.c | 1 + bfd/ieee.c | 1 + bfd/ihex.c | 1 + bfd/libbfd-in.h | 3 ++ bfd/libbfd.h | 3 ++ bfd/libcoff-in.h | 2 + bfd/libcoff.h | 2 + bfd/linker.c | 59 +++++++++++++++++++++++++ bfd/mach-o.c | 1 + bfd/mmo.c | 1 + bfd/nlm-target.h | 1 + bfd/oasys.c | 1 + bfd/pef.c | 1 + bfd/ppcboot.c | 1 + bfd/som.c | 1 + bfd/srec.c | 1 + bfd/targets.c | 7 ++- bfd/tekhex.c | 1 + bfd/versados.c | 1 + bfd/vms.c | 1 + bfd/xcoff-target.h | 1 + bfd/xcofflink.c | 28 ++++++------ bfd/xsym.c | 1 + ld/ChangeLog | 4 ++ ld/ldlang.c | 24 ++-------- ld/testsuite/ChangeLog | 5 +++ ld/testsuite/ld-powerpc/aix-export-2.nd | 1 + ld/testsuite/ld-powerpc/aix-export-2.s | 1 + ld/testsuite/ld-powerpc/aix52.exp | 4 ++ 43 files changed, 205 insertions(+), 36 deletions(-) create mode 100644 ld/testsuite/ld-powerpc/aix-export-2.nd create mode 100644 ld/testsuite/ld-powerpc/aix-export-2.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0917e65159f..2eadbd0ad48 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,47 @@ +2009-04-16 Richard Sandiford + + * aout-adobe.c (aout_32_bfd_define_common_symbol): Define. + * aout-target.h (MY_bfd_define_common_symbol): Likewise. + * aout-tic30.c (MY_bfd_define_common_symbol): Likewise. + * binary.c (binary_bfd_define_common_symbol): Likewise. + * bout.c (b_out_bfd_define_common_symbol): Likewise. + * coff-alpha.c (_bfd_ecoff_bfd_define_common_symbol): Likewise. + * coff-mips.c (_bfd_ecoff_bfd_define_common_symbol): Likewise. + * coffcode.h (coff_bfd_define_common_symbol): Likewise. + * elfxx-target.h (bfd_elfNN_bfd_define_common_symbol): Likewise. + * i386msdos.c (msdos_bfd_define_common_symbol): Likewise. + * i386os9k.c (os9k_bfd_define_common_symbol): Likewise. + * ieee.c (ieee_bfd_define_common_symbol): Likewise. + * ihex.c (ihex_bfd_define_common_symbol): Likewise. + * libbfd-in.h (_bfd_nolink_bfd_define_common_symbol): Likewise. + * mach-o.c (bfd_mach_o_bfd_define_common_symbol): Likewise. + * mmo.c (mmo_bfd_define_common_symbol): Likewise. + * nlm-target.h (nlm_bfd_define_common_symbol): Likewise. + * oasys.c (oasys_bfd_define_common_symbol): Likewise. + * pef.c (bfd_pef_bfd_define_common_symbol): Likewise. + * ppcboot.c (ppcboot_bfd_define_common_symbol): Likewise. + * som.c (som_bfd_define_common_symbol): Likewise. + * srec.c (srec_bfd_define_common_symbol): Likewise. + * tekhex.c (tekhex_bfd_define_common_symbol): Likewise. + * versados.c (versados_bfd_define_common_symbol): Likewise. + * vms.c (vms_bfd_define_common_symbol): Likewise. + * xcoff-target.h (_bfd_xcoff_bfd_define_common_symbol): Likewise. + * xsym.c (bfd_sym_bfd_define_common_symbol): Likewise. + * coff-rs6000.c (rs6000coff_vec): Add _bfd_xcoff_define_common_symbol. + (pmac_xcoff_vec): Likewise. + * coff64-rs6000.c (rs6000coff64_vec): Likewise. + (aix5coff64_vec): Likewise. + * linker.c (bfd_generic_define_common_symbol): New function. + * targets.c (BFD_JUMP_TABLE_LINK): Add NAME##_bfd_define_common_symbol. + (_bfd_define_common_symbol): New field. + * libcoff-in.h (_bfd_xcoff_define_common_symbol): Declare. + * xcofflink.c (_bfd_xcoff_define_common_symbol): New function. + (xcoff_build_ldsyms): Don't set XCOFF_DEF_REGULAR for common + symbols here. + * bfd-in2.h: Regenerate. + * libbfd.h: Likewise. + * libcoff.h: Likewise. + 2009-04-15 Anthony Green * targets.c: Add moxie support. diff --git a/bfd/aout-adobe.c b/bfd/aout-adobe.c index 8ccaf429f98..a8b13f497ad 100644 --- a/bfd/aout-adobe.c +++ b/bfd/aout-adobe.c @@ -463,6 +463,7 @@ aout_adobe_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED, #define aout_32_bfd_is_group_section bfd_generic_is_group_section #define aout_32_bfd_discard_group bfd_generic_discard_group #define aout_32_section_already_linked _bfd_generic_section_already_linked +#define aout_32_bfd_define_common_symbol bfd_generic_define_common_symbol #define aout_32_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define aout_32_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/aout-target.h b/bfd/aout-target.h index c063d039566..07a0870c9aa 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -493,6 +493,9 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) #define MY_section_already_linked \ _bfd_generic_section_already_linked #endif +#ifndef MY_bfd_define_common_symbol +#define MY_bfd_define_common_symbol bfd_generic_define_common_symbol +#endif #ifndef MY_bfd_reloc_type_lookup #define MY_bfd_reloc_type_lookup NAME (aout, reloc_type_lookup) #endif diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index 49815c4fdfb..a95bca15207 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -950,6 +950,9 @@ tic30_aout_set_arch_mach (bfd *abfd, #define MY_section_already_linked \ _bfd_generic_section_already_linked #endif +#ifndef MY_bfd_define_common_symbol +#define MY_bfd_define_common_symbol bfd_generic_define_common_symbol +#endif #ifndef MY_bfd_reloc_type_lookup #define MY_bfd_reloc_type_lookup tic30_aout_reloc_type_lookup #endif diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index bb2cbc3c061..2c6452ff6fe 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -5458,7 +5458,8 @@ typedef struct bfd_target NAME##_bfd_merge_sections, \ NAME##_bfd_is_group_section, \ NAME##_bfd_discard_group, \ - NAME##_section_already_linked \ + NAME##_section_already_linked, \ + NAME##_bfd_define_common_symbol int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); bfd_byte * (*_bfd_get_relocated_section_contents) @@ -5506,6 +5507,10 @@ typedef struct bfd_target void (*_section_already_linked) (bfd *, struct bfd_section *, struct bfd_link_info *); + /* Define a common symbol. */ + bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, + struct bfd_link_hash_entry *); + /* Routines to handle dynamic symbols and relocs. */ #define BFD_JUMP_TABLE_DYNAMIC(NAME) \ NAME##_get_dynamic_symtab_upper_bound, \ @@ -5570,6 +5575,13 @@ void bfd_section_already_linked (bfd *abfd, asection *sec, #define bfd_section_already_linked(abfd, sec, info) \ BFD_SEND (abfd, _section_already_linked, (abfd, sec, info)) +bfd_boolean bfd_generic_define_common_symbol + (bfd *output_bfd, struct bfd_link_info *info, + struct bfd_link_hash_entry *h); + +#define bfd_define_common_symbol(output_bfd, info, h) \ + BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) + /* Extracted from simple.c. */ bfd_byte *bfd_simple_get_relocated_section_contents (bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table); diff --git a/bfd/binary.c b/bfd/binary.c index c4aec2ba615..7e9bf102dd3 100644 --- a/bfd/binary.c +++ b/bfd/binary.c @@ -316,6 +316,7 @@ binary_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define binary_bfd_is_group_section bfd_generic_is_group_section #define binary_bfd_discard_group bfd_generic_discard_group #define binary_section_already_linked _bfd_generic_section_already_linked +#define binary_bfd_define_common_symbol bfd_generic_define_common_symbol #define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define binary_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define binary_bfd_link_just_syms _bfd_generic_link_just_syms diff --git a/bfd/bout.c b/bfd/bout.c index b6c710631ac..f4800d5acdc 100644 --- a/bfd/bout.c +++ b/bfd/bout.c @@ -1389,6 +1389,7 @@ b_out_bfd_get_relocated_section_contents (bfd *output_bfd, #define b_out_bfd_is_group_section bfd_generic_is_group_section #define b_out_bfd_discard_group bfd_generic_discard_group #define b_out_section_already_linked _bfd_generic_section_already_linked +#define b_out_bfd_define_common_symbol bfd_generic_define_common_symbol #define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window extern const bfd_target b_out_vec_little_host; diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index efe2dd39558..cd69043a26e 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -2398,6 +2398,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data = #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group #define _bfd_ecoff_section_already_linked \ _bfd_generic_section_already_linked +#define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol const bfd_target ecoffalpha_little_vec = { diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index f82c52dec91..5fd35104c22 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -1417,6 +1417,7 @@ static const struct ecoff_backend_data mips_ecoff_backend_data = #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group #define _bfd_ecoff_section_already_linked \ _bfd_generic_section_already_linked +#define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol extern const bfd_target ecoff_big_vec; diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index c5a486bab6b..4859f31b2b4 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -4233,6 +4233,7 @@ const bfd_target rs6000coff_vec = bfd_generic_is_group_section, bfd_generic_discard_group, _bfd_generic_section_already_linked, + _bfd_xcoff_define_common_symbol, /* Dynamic */ _bfd_xcoff_get_dynamic_symtab_upper_bound, @@ -4485,6 +4486,7 @@ const bfd_target pmac_xcoff_vec = bfd_generic_is_group_section, bfd_generic_discard_group, _bfd_generic_section_already_linked, + _bfd_xcoff_define_common_symbol, /* Dynamic */ _bfd_xcoff_get_dynamic_symtab_upper_bound, diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 1a0ff59713e..3a27ee07ce5 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -2805,6 +2805,7 @@ const bfd_target rs6000coff64_vec = bfd_generic_is_group_section, bfd_generic_discard_group, _bfd_generic_section_already_linked, + _bfd_xcoff_define_common_symbol, /* Dynamic */ _bfd_xcoff_get_dynamic_symtab_upper_bound, @@ -3058,6 +3059,7 @@ const bfd_target aix5coff64_vec = bfd_generic_is_group_section, bfd_generic_discard_group, _bfd_generic_section_already_linked, + _bfd_xcoff_define_common_symbol, /* Dynamic */ _bfd_xcoff_get_dynamic_symtab_upper_bound, diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 35c6f707582..11cc457f207 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -5600,6 +5600,10 @@ static bfd_coff_backend_data ticoff1_swap_table = _bfd_generic_section_already_linked #endif +#ifndef coff_bfd_define_common_symbol +#define coff_bfd_define_common_symbol bfd_generic_define_common_symbol +#endif + #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \ const bfd_target VAR = \ { \ diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 4aa8dd4b68f..d4cad168d91 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -169,6 +169,10 @@ _bfd_elf_section_already_linked #endif +#ifndef bfd_elfNN_bfd_define_common_symbol +#define bfd_elfNN_bfd_define_common_symbol bfd_generic_define_common_symbol +#endif + #ifndef bfd_elfNN_bfd_make_debug_symbol #define bfd_elfNN_bfd_make_debug_symbol \ ((asymbol * (*) (bfd *, void *, unsigned long)) bfd_nullvoidptr) diff --git a/bfd/i386msdos.c b/bfd/i386msdos.c index 46489fa7463..317adb80e41 100644 --- a/bfd/i386msdos.c +++ b/bfd/i386msdos.c @@ -148,6 +148,7 @@ msdos_set_section_contents (bfd *abfd, #define msdos_bfd_discard_group bfd_generic_discard_group #define msdos_section_already_linked \ _bfd_generic_section_already_linked +#define msdos_bfd_define_common_symbol bfd_generic_define_common_symbol #define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/i386os9k.c b/bfd/i386os9k.c index fa4fc425565..17c43720461 100644 --- a/bfd/i386os9k.c +++ b/bfd/i386os9k.c @@ -172,6 +172,7 @@ os9k_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define os9k_bfd_discard_group bfd_generic_discard_group #define os9k_section_already_linked \ _bfd_generic_section_already_linked +#define os9k_bfd_define_common_symbol bfd_generic_define_common_symbol #define os9k_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/ieee.c b/bfd/ieee.c index d032e9c133a..7d79124f3d7 100644 --- a/bfd/ieee.c +++ b/bfd/ieee.c @@ -3770,6 +3770,7 @@ ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define ieee_bfd_discard_group bfd_generic_discard_group #define ieee_section_already_linked \ _bfd_generic_section_already_linked +#define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/ihex.c b/bfd/ihex.c index 47e857ca1a0..c14c17ade28 100644 --- a/bfd/ihex.c +++ b/bfd/ihex.c @@ -933,6 +933,7 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define ihex_bfd_is_group_section bfd_generic_is_group_section #define ihex_bfd_discard_group bfd_generic_discard_group #define ihex_section_already_linked _bfd_generic_section_already_linked +#define ihex_bfd_define_common_symbol bfd_generic_define_common_symbol #define ihex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define ihex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ihex_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 949a2d2dc74..c860a29312c 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -416,6 +416,9 @@ extern bfd_boolean _bfd_generic_set_section_contents ((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false) #define _bfd_nolink_section_already_linked \ ((void (*) (bfd *, struct bfd_section *, struct bfd_link_info *)) bfd_void) +#define _bfd_nolink_bfd_define_common_symbol \ + ((bfd_boolean (*) (bfd *, struct bfd_link_info *, \ + struct bfd_link_hash_entry *)) bfd_false) /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 9d83209d359..7fc58a4e677 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -421,6 +421,9 @@ extern bfd_boolean _bfd_generic_set_section_contents ((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false) #define _bfd_nolink_section_already_linked \ ((void (*) (bfd *, struct bfd_section *, struct bfd_link_info *)) bfd_void) +#define _bfd_nolink_bfd_define_common_symbol \ + ((bfd_boolean (*) (bfd *, struct bfd_link_info *, \ + struct bfd_link_hash_entry *)) bfd_false) /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index c041be232bf..0aa3d3707ae 100644 --- a/bfd/libcoff-in.h +++ b/bfd/libcoff-in.h @@ -589,6 +589,8 @@ extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_xcoff_bfd_final_link (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_xcoff_define_common_symbol + (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *); extern bfd_boolean _bfd_ppc_xcoff_relocate_section (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, struct internal_reloc *, struct internal_syment *, asection **); diff --git a/bfd/libcoff.h b/bfd/libcoff.h index f963ce163c5..a053f6bf9e2 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -593,6 +593,8 @@ extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_xcoff_bfd_final_link (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_xcoff_define_common_symbol + (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *); extern bfd_boolean _bfd_ppc_xcoff_relocate_section (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, struct internal_reloc *, struct internal_syment *, asection **); diff --git a/bfd/linker.c b/bfd/linker.c index 6242bcbc65d..bfbd8861ddd 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -3186,3 +3186,62 @@ _bfd_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info) { bfd_link_hash_traverse (info->hash, fix_syms, obfd); } + +/* +FUNCTION + bfd_generic_define_common_symbol + +SYNOPSIS + bfd_boolean bfd_generic_define_common_symbol + (bfd *output_bfd, struct bfd_link_info *info, + struct bfd_link_hash_entry *h); + +DESCRIPTION + Convert common symbol @var{h} into a defined symbol. + Return TRUE on success and FALSE on failure. + +.#define bfd_define_common_symbol(output_bfd, info, h) \ +. BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) +. +*/ + +bfd_boolean +bfd_generic_define_common_symbol (bfd *output_bfd, + struct bfd_link_info *info ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry *h) +{ + unsigned int power_of_two; + bfd_vma alignment, size; + asection *section; + + BFD_ASSERT (h != NULL && h->type == bfd_link_hash_common); + + size = h->u.c.size; + power_of_two = h->u.c.p->alignment_power; + section = h->u.c.p->section; + + /* Increase the size of the section to align the common symbol. + The alignment must be a power of two. */ + alignment = bfd_octets_per_byte (output_bfd) << power_of_two; + BFD_ASSERT (alignment != 0 && (alignment & -alignment) == alignment); + section->size += alignment - 1; + section->size &= -alignment; + + /* Adjust the section's overall alignment if necessary. */ + if (power_of_two > section->alignment_power) + section->alignment_power = power_of_two; + + /* Change the symbol from common to defined. */ + h->type = bfd_link_hash_defined; + h->u.def.section = section; + h->u.def.value = section->size; + + /* Increase the size of the section. */ + section->size += size; + + /* Make sure the section is allocated in memory, and make sure that + it is no longer a common section. */ + section->flags |= SEC_ALLOC; + section->flags &= ~SEC_IS_COMMON; + return TRUE; +} diff --git a/bfd/mach-o.c b/bfd/mach-o.c index e0a6fa4772f..df15312b3cf 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -72,6 +72,7 @@ #define bfd_mach_o_bfd_is_group_section bfd_generic_is_group_section #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group #define bfd_mach_o_section_already_linked _bfd_generic_section_already_linked +#define bfd_mach_o_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define bfd_mach_o_core_file_matches_executable_p generic_core_file_matches_executable_p diff --git a/bfd/mmo.c b/bfd/mmo.c index c0e8082826f..084ce3f6a7f 100644 --- a/bfd/mmo.c +++ b/bfd/mmo.c @@ -3211,6 +3211,7 @@ mmo_write_object_contents (bfd *abfd) #define mmo_bfd_discard_group bfd_generic_discard_group #define mmo_section_already_linked \ _bfd_generic_section_already_linked +#define mmo_bfd_define_common_symbol bfd_generic_define_common_symbol /* We want to copy time of creation, otherwise we'd use BFD_JUMP_TABLE_COPY (_bfd_generic). */ diff --git a/bfd/nlm-target.h b/bfd/nlm-target.h index d346dc5a1f9..f817714c54e 100644 --- a/bfd/nlm-target.h +++ b/bfd/nlm-target.h @@ -49,6 +49,7 @@ #define nlm_bfd_is_group_section bfd_generic_is_group_section #define nlm_bfd_discard_group bfd_generic_discard_group #define nlm_section_already_linked _bfd_generic_section_already_linked +#define nlm_bfd_define_common_symbol bfd_generic_define_common_symbol #define nlm_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define nlm_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define nlm_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/oasys.c b/bfd/oasys.c index b1ca5271aab..c83d3ea257b 100644 --- a/bfd/oasys.c +++ b/bfd/oasys.c @@ -1198,6 +1198,7 @@ oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define oasys_bfd_is_group_section bfd_generic_is_group_section #define oasys_bfd_discard_group bfd_generic_discard_group #define oasys_section_already_linked _bfd_generic_section_already_linked +#define oasys_bfd_define_common_symbol bfd_generic_define_common_symbol #define oasys_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define oasys_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/pef.c b/bfd/pef.c index b839095146d..f275ee77f07 100644 --- a/bfd/pef.c +++ b/bfd/pef.c @@ -52,6 +52,7 @@ #define bfd_pef_bfd_is_group_section bfd_generic_is_group_section #define bfd_pef_bfd_discard_group bfd_generic_discard_group #define bfd_pef_section_already_linked _bfd_generic_section_already_linked +#define bfd_pef_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_pef_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define bfd_pef_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define bfd_pef_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/ppcboot.c b/bfd/ppcboot.c index d51280c8d8a..a420df3f54d 100644 --- a/bfd/ppcboot.c +++ b/bfd/ppcboot.c @@ -475,6 +475,7 @@ ppcboot_bfd_print_private_bfd_data (abfd, farg) #define ppcboot_bfd_discard_group bfd_generic_discard_group #define ppcboot_section_already_linked \ _bfd_generic_section_already_linked +#define ppcboot_bfd_define_common_symbol bfd_generic_define_common_symbol #define ppcboot_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define ppcboot_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ppcboot_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/som.c b/bfd/som.c index ccf760ab5d4..96da72e53fd 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -6349,6 +6349,7 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) #define som_bfd_is_group_section bfd_generic_is_group_section #define som_bfd_discard_group bfd_generic_discard_group #define som_section_already_linked _bfd_generic_section_already_linked +#define som_bfd_define_common_symbol bfd_generic_define_common_symbol #define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define som_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags diff --git a/bfd/srec.c b/bfd/srec.c index b7d515ccb9e..83e4538d2a3 100644 --- a/bfd/srec.c +++ b/bfd/srec.c @@ -1255,6 +1255,7 @@ srec_print_symbol (bfd *abfd, #define srec_bfd_is_group_section bfd_generic_is_group_section #define srec_bfd_discard_group bfd_generic_discard_group #define srec_section_already_linked _bfd_generic_section_already_linked +#define srec_bfd_define_common_symbol bfd_generic_define_common_symbol #define srec_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define srec_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/targets.c b/bfd/targets.c index a52b37d4428..c9d4c31fab0 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -441,7 +441,8 @@ BFD_JUMP_TABLE macros. . NAME##_bfd_merge_sections, \ . NAME##_bfd_is_group_section, \ . NAME##_bfd_discard_group, \ -. NAME##_section_already_linked \ +. NAME##_section_already_linked, \ +. NAME##_bfd_define_common_symbol . . int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); . bfd_byte * (*_bfd_get_relocated_section_contents) @@ -489,6 +490,10 @@ BFD_JUMP_TABLE macros. . void (*_section_already_linked) (bfd *, struct bfd_section *, . struct bfd_link_info *); . +. {* Define a common symbol. *} +. bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, +. struct bfd_link_hash_entry *); +. . {* Routines to handle dynamic symbols and relocs. *} .#define BFD_JUMP_TABLE_DYNAMIC(NAME) \ . NAME##_get_dynamic_symtab_upper_bound, \ diff --git a/bfd/tekhex.c b/bfd/tekhex.c index 2df774fc00f..01853da06d3 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -943,6 +943,7 @@ tekhex_print_symbol (bfd *abfd, #define tekhex_bfd_is_group_section bfd_generic_is_group_section #define tekhex_bfd_discard_group bfd_generic_discard_group #define tekhex_section_already_linked _bfd_generic_section_already_linked +#define tekhex_bfd_define_common_symbol bfd_generic_define_common_symbol #define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define tekhex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/versados.c b/bfd/versados.c index c4decd6f3ed..db9bd53fe0b 100644 --- a/bfd/versados.c +++ b/bfd/versados.c @@ -808,6 +808,7 @@ versados_canonicalize_reloc (bfd *abfd, #define versados_bfd_is_group_section bfd_generic_is_group_section #define versados_bfd_discard_group bfd_generic_discard_group #define versados_section_already_linked _bfd_generic_section_already_linked +#define versados_bfd_define_common_symbol bfd_generic_define_common_symbol #define versados_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define versados_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/vms.c b/bfd/vms.c index 8111d4955e2..ac03480278d 100644 --- a/bfd/vms.c +++ b/bfd/vms.c @@ -144,6 +144,7 @@ static bfd_boolean vms_bfd_set_private_flags (bfd *abfd, flagword flags); #define vms_bfd_is_group_section bfd_generic_is_group_section #define vms_bfd_discard_group bfd_generic_discard_group #define vms_section_already_linked _bfd_generic_section_already_linked +#define vms_bfd_define_common_symbol bfd_generic_define_common_symbol #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define vms_get_synthetic_symtab _bfd_nodynamic_get_synthetic_symtab diff --git a/bfd/xcoff-target.h b/bfd/xcoff-target.h index 8212a0da400..bcea6508696 100644 --- a/bfd/xcoff-target.h +++ b/bfd/xcoff-target.h @@ -57,6 +57,7 @@ #define _bfd_xcoff_bfd_merge_sections coff_bfd_merge_sections #define _bfd_xcoff_bfd_discard_group bfd_generic_discard_group #define _bfd_xcoff_section_already_linked _bfd_generic_section_already_linked +#define _bfd_xcoff_bfd_define_common_symbol _bfd_xcoff_define_common_symbol #define _bfd_xcoff_bfd_link_split_section coff_bfd_link_split_section #define CORE_FILE_P _bfd_dummy_target diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index 26500c6bd31..896292b393e 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -2471,6 +2471,21 @@ _bfd_xcoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info) } } +bfd_boolean +_bfd_xcoff_define_common_symbol (bfd *output_bfd ATTRIBUTE_UNUSED, + struct bfd_link_info *info ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry *harg) +{ + struct xcoff_link_hash_entry *h; + + if (!bfd_generic_define_common_symbol (output_bfd, info, harg)) + return FALSE; + + h = (struct xcoff_link_hash_entry *) harg; + h->flags |= XCOFF_DEF_REGULAR; + return TRUE; +} + /* If symbol H has not been interpreted as a function descriptor, see whether it should be. Set up its descriptor information if so. */ @@ -3330,19 +3345,6 @@ xcoff_post_gc_symbol (struct xcoff_link_hash_entry *h, void * p) if (h->flags & XCOFF_RTINIT) return TRUE; - /* If this is a final link, and the symbol was defined as a common - symbol in a regular object file, and there was no definition in - any dynamic object, then the linker will have allocated space for - the symbol in a common section but the XCOFF_DEF_REGULAR flag - will not have been set. */ - if (h->root.type == bfd_link_hash_defined - && (h->flags & XCOFF_DEF_REGULAR) == 0 - && (h->flags & XCOFF_REF_REGULAR) != 0 - && (h->flags & XCOFF_DEF_DYNAMIC) == 0 - && (bfd_is_abs_section (h->root.u.def.section) - || (h->root.u.def.section->owner->flags & DYNAMIC) == 0)) - h->flags |= XCOFF_DEF_REGULAR; - /* We don't want to garbage collect symbols which are not defined in XCOFF files. This is a convenient place to mark them. */ if (xcoff_hash_table (ldinfo->info)->gc diff --git a/bfd/xsym.c b/bfd/xsym.c index 793dd241446..706310ac616 100644 --- a/bfd/xsym.c +++ b/bfd/xsym.c @@ -46,6 +46,7 @@ #define bfd_sym_bfd_is_group_section bfd_generic_is_group_section #define bfd_sym_bfd_discard_group bfd_generic_discard_group #define bfd_sym_section_already_linked _bfd_generic_section_already_linked +#define bfd_sym_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_sym_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define bfd_sym_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define bfd_sym_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/ld/ChangeLog b/ld/ChangeLog index 099275dd487..befe0c68446 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2009-04-16 Richard Sandiford + + * ldlang.c (lang_one_common): Use bfd_define_common_symbol. + 2009-04-15 Anthony Green * configure.tgt: Add moxie support. diff --git a/ld/ldlang.c b/ld/ldlang.c index 412a86c5a4d..230994a90e5 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -5639,27 +5639,9 @@ lang_one_common (struct bfd_link_hash_entry *h, void *info) return TRUE; section = h->u.c.p->section; - - /* Increase the size of the section to align the common sym. */ - section->size += ((bfd_vma) 1 << (power_of_two + opb_shift)) - 1; - section->size &= (- (bfd_vma) 1 << (power_of_two + opb_shift)); - - /* Adjust the alignment if necessary. */ - if (power_of_two > section->alignment_power) - section->alignment_power = power_of_two; - - /* Change the symbol from common to defined. */ - h->type = bfd_link_hash_defined; - h->u.def.section = section; - h->u.def.value = section->size; - - /* Increase the size of the section. */ - section->size += size; - - /* Make sure the section is allocated in memory, and make sure that - it is no longer a common section. */ - section->flags |= SEC_ALLOC; - section->flags &= ~SEC_IS_COMMON; + if (!bfd_define_common_symbol (link_info.output_bfd, &link_info, h)) + einfo (_("%P%F: Could not define common symbol `%T': %E\n"), + h->root.string); if (config.map_file != NULL) { diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 7718d840d95..75b90500268 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-16 Richard Sandiford + + * ld-powerpc/aix-export-2.s, ld-powerpc/aix-export-2.nd: New test. + * ld-powerpc/aix52.exp: Run it. + 2009-04-16 Alan Modra * ld-libs/lib-1.s: Use "==" instead of ".set". diff --git a/ld/testsuite/ld-powerpc/aix-export-2.nd b/ld/testsuite/ld-powerpc/aix-export-2.nd new file mode 100644 index 00000000000..6f974331673 --- /dev/null +++ b/ld/testsuite/ld-powerpc/aix-export-2.nd @@ -0,0 +1 @@ +0*10000000 B x diff --git a/ld/testsuite/ld-powerpc/aix-export-2.s b/ld/testsuite/ld-powerpc/aix-export-2.s new file mode 100644 index 00000000000..f720635d669 --- /dev/null +++ b/ld/testsuite/ld-powerpc/aix-export-2.s @@ -0,0 +1 @@ + .comm x,4 diff --git a/ld/testsuite/ld-powerpc/aix52.exp b/ld/testsuite/ld-powerpc/aix52.exp index 4d32b2d0065..25479ddb390 100644 --- a/ld/testsuite/ld-powerpc/aix52.exp +++ b/ld/testsuite/ld-powerpc/aix52.exp @@ -128,6 +128,10 @@ set aix52tests { {{objdump -dj.data aix-export-1-full.dd}} "aix-export-1-full.so"} + {"Export test 2" "-shared -bexpall" + {} {aix-export-2.s} + {{nm -D aix-export-2.nd}} "aix-export-2.so"} + {"Garbage collection test 1" "-shared -binitfini:init_function:fini_function -bE:aix-gc-1.ex" "" {aix-gc-1.s} -- 2.30.2