This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC/A: Add a bfd hook for defining common symbols


The XCOFF linker uses XCOFF_DEF_REGULAR to check whether a symbol
has a regular definition.  xcofflink.c:xcoff_post_gc_symbol therefore
checks for common symbols that were defined by the linker:

  /* 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;

But this happens too late for things like xcoff_mark_auto_exports.

We could just put this code in a function and use it instead of testing
XCOFF_DEF_REGULAR directly.  That seems a bit messy though, and I don't
really like this idea of detecting what the linker has done after the fact.

Another alternative is to add a linker emulation hook.  But we'd
then be exposing XCOFF_DEF_REGULAR outside BFD, which doesn't seem
very clean either.

We already allocate .dynbss within BFD itself, so what do you think
about doing the same for common symbols?  Does the patch below look right,
or is it overkill?

Tested on powerpc-ibm-aix6.1.  Also tested on x86_64-linux-gnu
with --enable-targets=all --enable-64-bit-bfd.  (FWIW, I also
wrote a script to check for missed target vectors, but who knows
how effective it is.)

Richard


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.

Index: bfd/aout-adobe.c
===================================================================
--- bfd/aout-adobe.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/aout-adobe.c	2009-04-01 19:03:50.000000000 +0100
@@ -463,6 +463,7 @@ #define aout_32_bfd_merge_sections	     
 #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
Index: bfd/aout-target.h
===================================================================
--- bfd/aout-target.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/aout-target.h	2009-04-01 19:03:50.000000000 +0100
@@ -493,6 +493,9 @@ #define MY_bfd_discard_group bfd_generic
 #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
Index: bfd/aout-tic30.c
===================================================================
--- bfd/aout-tic30.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/aout-tic30.c	2009-04-01 19:03:50.000000000 +0100
@@ -950,6 +950,9 @@ #define MY_bfd_discard_group bfd_generic
 #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
Index: bfd/binary.c
===================================================================
--- bfd/binary.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/binary.c	2009-04-01 19:03:50.000000000 +0100
@@ -316,6 +316,7 @@ #define binary_bfd_merge_sections       
 #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
Index: bfd/bout.c
===================================================================
--- bfd/bout.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/bout.c	2009-04-01 19:03:50.000000000 +0100
@@ -1389,6 +1389,7 @@ #define b_out_bfd_merge_sections        
 #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;
Index: bfd/coff-alpha.c
===================================================================
--- bfd/coff-alpha.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/coff-alpha.c	2009-04-01 19:03:50.000000000 +0100
@@ -2398,6 +2398,7 @@ #define _bfd_ecoff_bfd_is_group_section 
 #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 =
 {
Index: bfd/coff-mips.c
===================================================================
--- bfd/coff-mips.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/coff-mips.c	2009-04-01 19:03:50.000000000 +0100
@@ -1417,6 +1417,7 @@ #define _bfd_ecoff_bfd_is_group_section 
 #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;
 
Index: bfd/coffcode.h
===================================================================
--- bfd/coffcode.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/coffcode.h	2009-04-01 19:03:50.000000000 +0100
@@ -5591,6 +5591,10 @@ #define coff_section_already_linked \
   _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 =							\
 {									\
Index: bfd/elfxx-target.h
===================================================================
--- bfd/elfxx-target.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/elfxx-target.h	2009-04-01 19:03:50.000000000 +0100
@@ -169,6 +169,10 @@ #define bfd_elfNN_section_already_linked
   _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)
Index: bfd/i386msdos.c
===================================================================
--- bfd/i386msdos.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/i386msdos.c	2009-04-01 19:03:50.000000000 +0100
@@ -148,6 +148,7 @@ #define msdos_bfd_is_group_section bfd_g
 #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
Index: bfd/i386os9k.c
===================================================================
--- bfd/i386os9k.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/i386os9k.c	2009-04-01 19:03:50.000000000 +0100
@@ -172,6 +172,7 @@ #define os9k_bfd_is_group_section bfd_ge
 #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
Index: bfd/ieee.c
===================================================================
--- bfd/ieee.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/ieee.c	2009-04-01 19:03:50.000000000 +0100
@@ -3770,6 +3770,7 @@ #define ieee_bfd_is_group_section bfd_ge
 #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
Index: bfd/ihex.c
===================================================================
--- bfd/ihex.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/ihex.c	2009-04-01 19:03:50.000000000 +0100
@@ -933,6 +933,7 @@ #define ihex_bfd_merge_sections         
 #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
Index: bfd/libbfd-in.h
===================================================================
--- bfd/libbfd-in.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/libbfd-in.h	2009-04-01 19:03:50.000000000 +0100
@@ -416,6 +416,9 @@ #define _bfd_nolink_bfd_link_split_secti
   ((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 \
+  ((void (*) (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *)) \
+   bfd_void)
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
Index: bfd/mach-o.c
===================================================================
--- bfd/mach-o.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/mach-o.c	2009-04-01 19:03:50.000000000 +0100
@@ -72,6 +72,7 @@ #define bfd_mach_o_bfd_merge_sections   
 #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
 
Index: bfd/mmo.c
===================================================================
--- bfd/mmo.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/mmo.c	2009-04-01 19:03:50.000000000 +0100
@@ -3211,6 +3211,7 @@ #define mmo_bfd_is_group_section bfd_gen
 #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).  */
Index: bfd/nlm-target.h
===================================================================
--- bfd/nlm-target.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/nlm-target.h	2009-04-01 19:03:50.000000000 +0100
@@ -49,6 +49,7 @@ #define nlm_bfd_merge_sections          
 #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
Index: bfd/oasys.c
===================================================================
--- bfd/oasys.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/oasys.c	2009-04-01 19:03:50.000000000 +0100
@@ -1198,6 +1198,7 @@ #define oasys_bfd_merge_sections        
 #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
Index: bfd/pef.c
===================================================================
--- bfd/pef.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/pef.c	2009-04-01 19:03:50.000000000 +0100
@@ -52,6 +52,7 @@ #define bfd_pef_bfd_merge_sections      
 #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
Index: bfd/ppcboot.c
===================================================================
--- bfd/ppcboot.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/ppcboot.c	2009-04-01 19:03:50.000000000 +0100
@@ -475,6 +475,7 @@ #define ppcboot_bfd_is_group_section bfd
 #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
Index: bfd/som.c
===================================================================
--- bfd/som.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/som.c	2009-04-01 19:03:50.000000000 +0100
@@ -6349,6 +6349,7 @@ #define som_bfd_merge_sections		        
 #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
Index: bfd/srec.c
===================================================================
--- bfd/srec.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/srec.c	2009-04-01 19:03:50.000000000 +0100
@@ -1255,6 +1255,7 @@ #define srec_bfd_merge_sections         
 #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
Index: bfd/tekhex.c
===================================================================
--- bfd/tekhex.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/tekhex.c	2009-04-01 19:03:50.000000000 +0100
@@ -943,6 +943,7 @@ #define tekhex_bfd_merge_sections       
 #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
Index: bfd/versados.c
===================================================================
--- bfd/versados.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/versados.c	2009-04-01 19:03:50.000000000 +0100
@@ -808,6 +808,7 @@ #define versados_bfd_merge_sections     
 #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
Index: bfd/vms.c
===================================================================
--- bfd/vms.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/vms.c	2009-04-01 19:03:50.000000000 +0100
@@ -144,6 +144,7 @@ #define vms_bfd_link_just_syms          
 #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
 
Index: bfd/xcoff-target.h
===================================================================
--- bfd/xcoff-target.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/xcoff-target.h	2009-04-01 19:03:50.000000000 +0100
@@ -57,6 +57,7 @@ #define _bfd_xcoff_bfd_gc_sections      
 #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
Index: bfd/xsym.c
===================================================================
--- bfd/xsym.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/xsym.c	2009-04-01 19:03:50.000000000 +0100
@@ -46,6 +46,7 @@ #define bfd_sym_bfd_merge_sections      
 #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
Index: bfd/coff-rs6000.c
===================================================================
--- bfd/coff-rs6000.c	2009-04-01 19:03:32.000000000 +0100
+++ bfd/coff-rs6000.c	2009-04-01 19:03:50.000000000 +0100
@@ -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,
Index: bfd/coff64-rs6000.c
===================================================================
--- bfd/coff64-rs6000.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/coff64-rs6000.c	2009-04-01 19:03:50.000000000 +0100
@@ -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,
Index: bfd/linker.c
===================================================================
--- bfd/linker.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/linker.c	2009-04-01 19:03:50.000000000 +0100
@@ -3186,3 +3186,55 @@ _bfd_fix_excluded_sec_syms (bfd *obfd, s
 {
   bfd_link_hash_traverse (info->hash, fix_syms, obfd);
 }
+
+/*
+FUNCTION
+	bfd_generic_define_common_symbol
+
+SYNOPSIS
+	void bfd_generic_define_common_symbol (bfd *output_bfd,
+					       struct bfd_link_info *info,
+					       struct bfd_link_hash_entry *h);
+
+DESCRIPTION
+	Define common symbol @var{h}.
+
+.#define bfd_define_common_symbol(output_bfd, info, h) \
+.       BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h))
+.
+*/
+
+void
+bfd_generic_define_common_symbol (bfd *obfd ATTRIBUTE_UNUSED,
+				  struct bfd_link_info *info ATTRIBUTE_UNUSED,
+				  struct bfd_link_hash_entry *h)
+{
+  unsigned int power_of_two;
+  bfd_vma size;
+  asection *section;
+
+  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 sym.  */
+  section->size += ((bfd_vma) 1 << power_of_two) - 1;
+  section->size &= (- (bfd_vma) 1 << power_of_two);
+
+  /* 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;
+}
Index: bfd/targets.c
===================================================================
--- bfd/targets.c	2009-04-01 19:00:44.000000000 +0100
+++ bfd/targets.c	2009-04-01 19:03:50.000000000 +0100
@@ -441,7 +441,8 @@
 .  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 @@
 .  void (*_section_already_linked) (bfd *, struct bfd_section *,
 .				    struct bfd_link_info *);
 .
+.  {* Define a common symbol.  *}
+.  void (*_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, \
Index: bfd/libcoff-in.h
===================================================================
--- bfd/libcoff-in.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/libcoff-in.h	2009-04-01 19:03:50.000000000 +0100
@@ -589,6 +589,8 @@ #define coff_get_section_contents_in_win
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean _bfd_xcoff_bfd_final_link
   (bfd *, struct bfd_link_info *);
+extern void _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 **);
Index: bfd/xcofflink.c
===================================================================
--- bfd/xcofflink.c	2009-04-01 19:03:38.000000000 +0100
+++ bfd/xcofflink.c	2009-04-01 19:04:14.000000000 +0100
@@ -2471,6 +2471,18 @@ _bfd_xcoff_bfd_link_add_symbols (bfd *ab
     }
 }
 
+void
+_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;
+
+  h = (struct xcoff_link_hash_entry *) harg;
+  bfd_generic_define_common_symbol (output_bfd, info, harg);
+  h->flags |= XCOFF_DEF_REGULAR;
+}
+
 /* If symbol H has not been interpreted as a function descriptor,
    see whether it should be.  Set up its descriptor information if so.  */
 
@@ -3328,19 +3340,6 @@ xcoff_post_gc_symbol (struct xcoff_link_
   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
Index: bfd/bfd-in2.h
===================================================================
--- bfd/bfd-in2.h	2009-04-01 19:03:28.000000000 +0100
+++ bfd/bfd-in2.h	2009-04-01 19:03:50.000000000 +0100
@@ -5455,7 +5455,8 @@ #define BFD_JUMP_TABLE_LINK(NAME) \
   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)
@@ -5503,6 +5504,10 @@ #define BFD_JUMP_TABLE_LINK(NAME) \
   void (*_section_already_linked) (bfd *, struct bfd_section *,
                                    struct bfd_link_info *);
 
+  /* Define a common symbol.  */
+  void (*_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, \
@@ -5567,6 +5572,13 @@ void bfd_section_already_linked (bfd *ab
 #define bfd_section_already_linked(abfd, sec, info) \
        BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
 
+void 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);
Index: bfd/libbfd.h
===================================================================
--- bfd/libbfd.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/libbfd.h	2009-04-01 19:03:50.000000000 +0100
@@ -421,6 +421,9 @@ #define _bfd_nolink_bfd_link_split_secti
   ((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 \
+  ((void (*) (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *)) \
+   bfd_void)
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
Index: bfd/libcoff.h
===================================================================
--- bfd/libcoff.h	2009-04-01 19:00:44.000000000 +0100
+++ bfd/libcoff.h	2009-04-01 19:03:50.000000000 +0100
@@ -593,6 +593,8 @@ #define coff_get_section_contents_in_win
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean _bfd_xcoff_bfd_final_link
   (bfd *, struct bfd_link_info *);
+extern void _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 **);
Index: ld/ldlang.c
===================================================================
--- ld/ldlang.c	2009-04-01 19:00:44.000000000 +0100
+++ ld/ldlang.c	2009-04-01 19:03:50.000000000 +0100
@@ -5641,27 +5641,7 @@ lang_one_common (struct bfd_link_hash_en
     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;
+  bfd_define_common_symbol (link_info.output_bfd, &link_info, h);
 
   if (config.map_file != NULL)
     {
Index: ld/testsuite/ld-powerpc/aix-export-2.s
===================================================================
--- /dev/null	2009-04-01 18:14:04.503808585 +0100
+++ ld/testsuite/ld-powerpc/aix-export-2.s	2009-04-01 19:03:50.000000000 +0100
@@ -0,0 +1,1 @@
+	.comm	x,4
Index: ld/testsuite/ld-powerpc/aix-export-2.nd
===================================================================
--- /dev/null	2009-04-01 18:14:04.503808585 +0100
+++ ld/testsuite/ld-powerpc/aix-export-2.nd	2009-04-01 19:03:50.000000000 +0100
@@ -0,0 +1,1 @@
+0*10000000 B x
Index: ld/testsuite/ld-powerpc/aix52.exp
===================================================================
--- ld/testsuite/ld-powerpc/aix52.exp	2009-04-01 19:03:34.000000000 +0100
+++ ld/testsuite/ld-powerpc/aix52.exp	2009-04-01 19:03:50.000000000 +0100
@@ -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}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]