From 1338dd10efb7f5b6ab29142fa07004ff900a20b4 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Mon, 23 Nov 2009 14:41:33 +0000 Subject: [PATCH] 2009-11-23 Paul Brook ld/ * ldexp.c: Copy symbol type for simple assignments. bfd/ * libbfd-in.h (_bfd_generic_copy_link_hash_symbol_type): Add prototype. * elf-bfd.h (_bfd_elf_copy_link_hash_symbol_type): Add prototype. * linker.c (_bfd_generic_copy_link_hash_symbol_type): New function. * elflink.c (_bfd_elf_copy_link_hash_symbol_type): New function. * targets.c (BFD_JUMP_TABLE_LINK, struct bfd_target): Add _copy_link_hash_symbol_type. * bfd/coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Add _bfd_generic_copy_link_hash_symbol_type. * bfd/coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Add _bfd_generic_copy_link_hash_symbol_type. * aout-adobe.c (aout_32_bfd_copy_link_hash_symbol_type): Define. * aout-target.h (MY_bfd_copy_link_hash_symbol_type): Define. * aout-tic30.c (MY_bfd_copy_link_hash_symbol_type): Define. * binary.c (binary_bfd_copy_link_hash_symbol_type): Define. * bout.c (b_out_bfd_copy_link_hash_symbol_type): Define. * coffcode.h (coff_bfd_copy_link_hash_symbol_type): Define. * elfxx-target.h (bfd_elfNN_bfd_copy_link_hash_symbol_type): Define. * i386msdos.c (msdos_bfd_copy_link_hash_symbol_type): Define. * i386os9k.c (os9k_bfd_copy_link_hash_symbol_type): Define. * ieee.c (ieee_bfd_copy_link_hash_symbol_type): Define. * ihex.c (ihex_bfd_copy_link_hash_symbol_type): Define. * libecoff.h (_bfd_ecoff_bfd_copy_link_hash_symbol_type): Define. * mach-o.c (bfd_mach_o_bfd_copy_link_hash_symbol_type): Define. * mmo.c (mmo_bfd_copy_link_hash_symbol_type): Define. * nlm-target.h (nlm_bfd_copy_link_hash_symbol_type): Define. * oasys.c (oasys_bfd_copy_link_hash_symbol_type): Define. * pef.c (bfd_pef_bfd_copy_link_hash_symbol_type): Define. * ppcboot.c (ppcboot_bfd_copy_link_hash_symbol_type): Define. * som.c (som_bfd_copy_link_hash_symbol_type): Define. * srec.c (srec_bfd_copy_link_hash_symbol_type): Define. * tekhex.c (tekhex_bfd_copy_link_hash_symbol_type): Define. * versados.c (versados_bfd_copy_link_hash_symbol_type): Define. * vms.c (vms_bfd_copy_link_hash_symbol_type): Define. * xsym.c (bfd_sym_bfd_copy_link_hash_symbol_type): Define. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. ld/testsuite * ld-arm/script-type.sym: New test. * ld-arm/script-type.s: New test. * ld-arm/script-type.s: New test. --- bfd/ChangeLog | 40 +++++++++++++++++++++++++++++ bfd/aout-adobe.c | 2 ++ bfd/aout-target.h | 4 +++ bfd/aout-tic30.c | 4 +++ bfd/bfd-in2.h | 7 +++++ bfd/binary.c | 2 ++ bfd/bout.c | 2 ++ bfd/coff-rs6000.c | 2 ++ bfd/coff64-rs6000.c | 2 ++ bfd/coffcode.h | 2 ++ bfd/elf-bfd.h | 2 ++ bfd/elflink.c | 12 +++++++++ bfd/elfxx-target.h | 5 ++++ bfd/i386msdos.c | 2 ++ bfd/i386os9k.c | 2 ++ bfd/ieee.c | 2 ++ bfd/ihex.c | 2 ++ bfd/libbfd-in.h | 7 +++++ bfd/libbfd.h | 7 +++++ bfd/libecoff.h | 2 ++ bfd/linker.c | 11 ++++++++ bfd/mach-o-target.c | 2 ++ bfd/mmo.c | 2 ++ bfd/nlm-target.h | 2 ++ bfd/oasys.c | 2 ++ bfd/pef.c | 2 ++ bfd/ppcboot.c | 2 ++ bfd/som.c | 2 ++ bfd/srec.c | 2 ++ bfd/targets.c | 7 +++++ bfd/tekhex.c | 2 ++ bfd/versados.c | 2 ++ bfd/vms.c | 2 ++ bfd/xsym.c | 2 ++ ld/ChangeLog | 4 +++ ld/ldexp.c | 14 ++++++++++ ld/testsuite/ChangeLog | 6 +++++ ld/testsuite/ld-arm/arm-elf.exp | 3 +++ ld/testsuite/ld-arm/script-type.ld | 7 +++++ ld/testsuite/ld-arm/script-type.s | 20 +++++++++++++++ ld/testsuite/ld-arm/script-type.sym | 15 +++++++++++ 41 files changed, 221 insertions(+) create mode 100644 ld/testsuite/ld-arm/script-type.ld create mode 100644 ld/testsuite/ld-arm/script-type.s create mode 100644 ld/testsuite/ld-arm/script-type.sym diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a3b9a8fe4b..2f7a85d8ef 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,43 @@ +2009-11-23 Paul Brook + + * libbfd-in.h (_bfd_generic_copy_link_hash_symbol_type): Add + prototype. + * elf-bfd.h (_bfd_elf_copy_link_hash_symbol_type): Add prototype. + * linker.c (_bfd_generic_copy_link_hash_symbol_type): New function. + * elflink.c (_bfd_elf_copy_link_hash_symbol_type): New function. + * targets.c (BFD_JUMP_TABLE_LINK, struct bfd_target): Add + _copy_link_hash_symbol_type. + * bfd/coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Add + _bfd_generic_copy_link_hash_symbol_type. + * bfd/coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Add + _bfd_generic_copy_link_hash_symbol_type. + * aout-adobe.c (aout_32_bfd_copy_link_hash_symbol_type): Define. + * aout-target.h (MY_bfd_copy_link_hash_symbol_type): Define. + * aout-tic30.c (MY_bfd_copy_link_hash_symbol_type): Define. + * binary.c (binary_bfd_copy_link_hash_symbol_type): Define. + * bout.c (b_out_bfd_copy_link_hash_symbol_type): Define. + * coffcode.h (coff_bfd_copy_link_hash_symbol_type): Define. + * elfxx-target.h (bfd_elfNN_bfd_copy_link_hash_symbol_type): Define. + * i386msdos.c (msdos_bfd_copy_link_hash_symbol_type): Define. + * i386os9k.c (os9k_bfd_copy_link_hash_symbol_type): Define. + * ieee.c (ieee_bfd_copy_link_hash_symbol_type): Define. + * ihex.c (ihex_bfd_copy_link_hash_symbol_type): Define. + * libecoff.h (_bfd_ecoff_bfd_copy_link_hash_symbol_type): Define. + * mach-o.c (bfd_mach_o_bfd_copy_link_hash_symbol_type): Define. + * mmo.c (mmo_bfd_copy_link_hash_symbol_type): Define. + * nlm-target.h (nlm_bfd_copy_link_hash_symbol_type): Define. + * oasys.c (oasys_bfd_copy_link_hash_symbol_type): Define. + * pef.c (bfd_pef_bfd_copy_link_hash_symbol_type): Define. + * ppcboot.c (ppcboot_bfd_copy_link_hash_symbol_type): Define. + * som.c (som_bfd_copy_link_hash_symbol_type): Define. + * srec.c (srec_bfd_copy_link_hash_symbol_type): Define. + * tekhex.c (tekhex_bfd_copy_link_hash_symbol_type): Define. + * versados.c (versados_bfd_copy_link_hash_symbol_type): Define. + * vms.c (vms_bfd_copy_link_hash_symbol_type): Define. + * xsym.c (bfd_sym_bfd_copy_link_hash_symbol_type): Define. + * bfd-in2.h: Regenerate. + * libbfd.h: Regenerate. + 2009-11-19 Tristan Gingold * coff-rs6000.c (rs6000coff_vec): Use generic routines instead of diff --git a/bfd/aout-adobe.c b/bfd/aout-adobe.c index 02f6ccbb35..ca0e0035d2 100644 --- a/bfd/aout-adobe.c +++ b/bfd/aout-adobe.c @@ -468,6 +468,8 @@ aout_adobe_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED, #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 #define aout_32_bfd_link_just_syms _bfd_generic_link_just_syms +#define aout_32_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define aout_32_bfd_final_link _bfd_generic_final_link #define aout_32_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/aout-target.h b/bfd/aout-target.h index 96d7f97157..39c8d34c1a 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -523,6 +523,10 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) #ifndef MY_bfd_link_just_syms #define MY_bfd_link_just_syms _bfd_generic_link_just_syms #endif +#ifndef MY_bfd_copy_link_hash_symbol_type +#define MY_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type +#endif #ifndef MY_bfd_link_split_section #define MY_bfd_link_split_section _bfd_generic_link_split_section #endif diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index ef74fa6d96..feaec8a8c7 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -980,6 +980,10 @@ tic30_aout_set_arch_mach (bfd *abfd, #ifndef MY_bfd_link_just_syms #define MY_bfd_link_just_syms _bfd_generic_link_just_syms #endif +#ifndef MY_bfd_copy_link_hash_symbol_type +#define MY_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type +#endif #ifndef MY_bfd_link_split_section #define MY_bfd_link_split_section _bfd_generic_link_split_section #endif diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 455ec5696f..aa58ca659f 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -5601,6 +5601,7 @@ typedef struct bfd_target NAME##_bfd_link_hash_table_free, \ NAME##_bfd_link_add_symbols, \ NAME##_bfd_link_just_syms, \ + NAME##_bfd_copy_link_hash_symbol_type, \ NAME##_bfd_final_link, \ NAME##_bfd_link_split_section, \ NAME##_bfd_gc_sections, \ @@ -5632,6 +5633,12 @@ typedef struct bfd_target /* Indicate that we are only retrieving symbol values from this section. */ void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); + /* Copy the symbol type of a linker hash table entry. */ +#define bfd_copy_link_hash_symbol_type(b, t, f) \ + BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) + void (*_bfd_copy_link_hash_symbol_type) + (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); + /* Do a link based on the link_order structures attached to each section of the BFD. */ bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); diff --git a/bfd/binary.c b/bfd/binary.c index d264a09209..2af0293ef4 100644 --- a/bfd/binary.c +++ b/bfd/binary.c @@ -307,6 +307,8 @@ binary_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #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 +#define binary_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define binary_bfd_link_add_symbols _bfd_generic_link_add_symbols #define binary_bfd_final_link _bfd_generic_final_link #define binary_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/bout.c b/bfd/bout.c index f2721e87e5..ad53d8fc32 100644 --- a/bfd/bout.c +++ b/bfd/bout.c @@ -1386,6 +1386,8 @@ b_out_bfd_get_relocated_section_contents (bfd *output_bfd, #define b_out_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols #define b_out_bfd_link_just_syms _bfd_generic_link_just_syms +#define b_out_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define b_out_bfd_final_link _bfd_generic_final_link #define b_out_bfd_link_split_section _bfd_generic_link_split_section #define b_out_bfd_gc_sections bfd_generic_gc_sections diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 2482cfbc7e..2ee74ecf57 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -4230,6 +4230,7 @@ const bfd_target rs6000coff_vec = _bfd_generic_link_hash_table_free, _bfd_xcoff_bfd_link_add_symbols, _bfd_generic_link_just_syms, + _bfd_generic_copy_link_hash_symbol_type, _bfd_xcoff_bfd_final_link, _bfd_generic_link_split_section, bfd_generic_gc_sections, @@ -4483,6 +4484,7 @@ const bfd_target pmac_xcoff_vec = _bfd_generic_link_hash_table_free, _bfd_xcoff_bfd_link_add_symbols, _bfd_generic_link_just_syms, + _bfd_generic_copy_link_hash_symbol_type, _bfd_xcoff_bfd_final_link, _bfd_generic_link_split_section, bfd_generic_gc_sections, diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 9b653e62b9..4d618c1acc 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -2800,6 +2800,7 @@ const bfd_target rs6000coff64_vec = _bfd_generic_link_hash_table_free, _bfd_xcoff_bfd_link_add_symbols, _bfd_generic_link_just_syms, + _bfd_generic_copy_link_hash_symbol_type, _bfd_xcoff_bfd_final_link, _bfd_generic_link_split_section, bfd_generic_gc_sections, @@ -3054,6 +3055,7 @@ const bfd_target aix5coff64_vec = _bfd_generic_link_hash_table_free, _bfd_xcoff_bfd_link_add_symbols, _bfd_generic_link_just_syms, + _bfd_generic_copy_link_hash_symbol_type, _bfd_xcoff_bfd_final_link, _bfd_generic_link_split_section, bfd_generic_gc_sections, diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 19f4159ac3..55c54deb77 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -5328,6 +5328,8 @@ dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED, #endif /* ! defined (coff_relocate_section) */ #define coff_bfd_link_just_syms _bfd_generic_link_just_syms +#define coff_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define coff_bfd_link_split_section _bfd_generic_link_split_section #ifndef coff_start_final_link diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 7cc420c7a8..daa2b62d9a 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1751,6 +1751,8 @@ extern asection *_bfd_elf_check_kept_section (asection *, struct bfd_link_info *); extern void _bfd_elf_link_just_syms (asection *, struct bfd_link_info *); +extern void _bfd_elf_copy_link_hash_symbol_type + (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); extern bfd_boolean _bfd_elf_copy_private_header_data (bfd *, bfd *); extern bfd_boolean _bfd_elf_copy_private_symbol_data diff --git a/bfd/elflink.c b/bfd/elflink.c index 0153411ae8..8e29154e6e 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -12596,3 +12596,15 @@ _bfd_elf_make_dynamic_reloc_section (asection * sec, return reloc_sec; } + +/* Copy the ELF symbol type associated with a linker hash entry. */ +void +_bfd_elf_copy_link_hash_symbol_type (bfd *abfd ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry * hdest, + struct bfd_link_hash_entry * hsrc) +{ + struct elf_link_hash_entry *ehdest = (struct elf_link_hash_entry *)hdest; + struct elf_link_hash_entry *ehsrc = (struct elf_link_hash_entry *)hsrc; + + ehdest->type = ehsrc->type; +} diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 413f273f8b..ebce6a8f07 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -260,6 +260,11 @@ #define bfd_elfNN_bfd_link_just_syms _bfd_elf_link_just_syms #endif +#ifndef bfd_elfNN_bfd_copy_link_hash_symbol_type +#define bfd_elfNN_bfd_copy_link_hash_symbol_type \ + _bfd_elf_copy_link_hash_symbol_type +#endif + #ifndef bfd_elfNN_bfd_link_split_section #define bfd_elfNN_bfd_link_split_section _bfd_generic_link_split_section #endif diff --git a/bfd/i386msdos.c b/bfd/i386msdos.c index 2059d9cafc..95d9775cf7 100644 --- a/bfd/i386msdos.c +++ b/bfd/i386msdos.c @@ -153,6 +153,8 @@ msdos_set_section_contents (bfd *abfd, #define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols #define msdos_bfd_link_just_syms _bfd_generic_link_just_syms +#define msdos_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define msdos_bfd_final_link _bfd_generic_final_link #define msdos_bfd_link_split_section _bfd_generic_link_split_section #define msdos_set_arch_mach _bfd_generic_set_arch_mach diff --git a/bfd/i386os9k.c b/bfd/i386os9k.c index 4c33a6e67e..a5e89208df 100644 --- a/bfd/i386os9k.c +++ b/bfd/i386os9k.c @@ -177,6 +177,8 @@ os9k_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols #define os9k_bfd_link_just_syms _bfd_generic_link_just_syms +#define os9k_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define os9k_bfd_final_link _bfd_generic_final_link #define os9k_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/ieee.c b/bfd/ieee.c index 1fecf5ae32..68bdd5ed57 100644 --- a/bfd/ieee.c +++ b/bfd/ieee.c @@ -3775,6 +3775,8 @@ ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms +#define ieee_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define ieee_bfd_final_link _bfd_generic_final_link #define ieee_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/ihex.c b/bfd/ihex.c index aaad6d7b46..6a9816c0b5 100644 --- a/bfd/ihex.c +++ b/bfd/ihex.c @@ -939,6 +939,8 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define ihex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ihex_bfd_link_add_symbols _bfd_generic_link_add_symbols #define ihex_bfd_link_just_syms _bfd_generic_link_just_syms +#define ihex_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define ihex_bfd_final_link _bfd_generic_final_link #define ihex_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 2e441db7e7..8c6f9b6321 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -410,6 +410,9 @@ extern bfd_boolean _bfd_generic_set_section_contents ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) #define _bfd_nolink_bfd_link_just_syms \ ((void (*) (asection *, struct bfd_link_info *)) bfd_void) +#define _bfd_nolink_bfd_copy_link_hash_symbol_type \ + ((void (*) (bfd *, struct bfd_link_hash_entry *, \ + struct bfd_link_hash_entry *)) bfd_void) #define _bfd_nolink_bfd_final_link \ ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) #define _bfd_nolink_bfd_link_split_section \ @@ -524,6 +527,10 @@ extern bfd_boolean _bfd_generic_link_add_one_symbol extern void _bfd_generic_link_just_syms (asection *, struct bfd_link_info *); +/* Generic routine that does nothing. */ +extern void _bfd_generic_copy_link_hash_symbol_type + (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); + /* Generic link routine. */ extern bfd_boolean _bfd_generic_final_link (bfd *, struct bfd_link_info *); diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 7fe65789bd..8146ef9011 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -415,6 +415,9 @@ extern bfd_boolean _bfd_generic_set_section_contents ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) #define _bfd_nolink_bfd_link_just_syms \ ((void (*) (asection *, struct bfd_link_info *)) bfd_void) +#define _bfd_nolink_bfd_copy_link_hash_symbol_type \ + ((void (*) (bfd *, struct bfd_link_hash_entry *, \ + struct bfd_link_hash_entry *)) bfd_void) #define _bfd_nolink_bfd_final_link \ ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) #define _bfd_nolink_bfd_link_split_section \ @@ -529,6 +532,10 @@ extern bfd_boolean _bfd_generic_link_add_one_symbol extern void _bfd_generic_link_just_syms (asection *, struct bfd_link_info *); +/* Generic routine that does nothing. */ +extern void _bfd_generic_copy_link_hash_symbol_type + (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); + /* Generic link routine. */ extern bfd_boolean _bfd_generic_final_link (bfd *, struct bfd_link_info *); diff --git a/bfd/libecoff.h b/bfd/libecoff.h index 0e7ea855c5..75c65e7fbe 100644 --- a/bfd/libecoff.h +++ b/bfd/libecoff.h @@ -315,6 +315,8 @@ extern struct bfd_link_hash_table *_bfd_ecoff_bfd_link_hash_table_create extern bfd_boolean _bfd_ecoff_bfd_link_add_symbols (bfd *, struct bfd_link_info *); #define _bfd_ecoff_bfd_link_just_syms _bfd_generic_link_just_syms +#define _bfd_ecoff_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type extern bfd_boolean _bfd_ecoff_bfd_final_link (bfd *, struct bfd_link_info *); diff --git a/bfd/linker.c b/bfd/linker.c index 1163a5591c..76bc70af09 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -797,6 +797,17 @@ _bfd_generic_link_just_syms (asection *sec, sec->output_offset = sec->vma; } +/* Copy the type of a symbol assiciated with a linker hast table entry. + Override this so that symbols created in linker scripts get their + type from the RHS of the assignment. + The default implementation does nothing. */ +void +_bfd_generic_copy_link_hash_symbol_type (bfd *abfd ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry * hdest ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry * hsrc ATTRIBUTE_UNUSED) +{ +} + /* Add symbols from an object file to the global hash table. */ static bfd_boolean diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c index c3084673e9..2a30b2ed1f 100644 --- a/bfd/mach-o-target.c +++ b/bfd/mach-o-target.c @@ -53,6 +53,8 @@ #define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols #define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms +#define bfd_mach_o_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define bfd_mach_o_bfd_final_link _bfd_generic_final_link #define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section #define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach diff --git a/bfd/mmo.c b/bfd/mmo.c index 39cc2699e0..eee27c3a26 100644 --- a/bfd/mmo.c +++ b/bfd/mmo.c @@ -3199,6 +3199,8 @@ mmo_write_object_contents (bfd *abfd) #define mmo_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define mmo_bfd_link_add_symbols _bfd_generic_link_add_symbols #define mmo_bfd_link_just_syms _bfd_generic_link_just_syms +#define mmo_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define mmo_bfd_final_link _bfd_generic_final_link #define mmo_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/nlm-target.h b/bfd/nlm-target.h index 809019066a..add69372d2 100644 --- a/bfd/nlm-target.h +++ b/bfd/nlm-target.h @@ -54,6 +54,8 @@ #define nlm_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define nlm_bfd_link_add_symbols _bfd_generic_link_add_symbols #define nlm_bfd_link_just_syms _bfd_generic_link_just_syms +#define nlm_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define nlm_bfd_final_link _bfd_generic_final_link #define nlm_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/oasys.c b/bfd/oasys.c index aad22a12ff..17714ec207 100644 --- a/bfd/oasys.c +++ b/bfd/oasys.c @@ -1203,6 +1203,8 @@ oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define oasys_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols #define oasys_bfd_link_just_syms _bfd_generic_link_just_syms +#define oasys_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define oasys_bfd_final_link _bfd_generic_final_link #define oasys_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/pef.c b/bfd/pef.c index 4fcae1e543..b7156f0623 100644 --- a/bfd/pef.c +++ b/bfd/pef.c @@ -57,6 +57,8 @@ #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 #define bfd_pef_bfd_link_just_syms _bfd_generic_link_just_syms +#define bfd_pef_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define bfd_pef_bfd_final_link _bfd_generic_final_link #define bfd_pef_bfd_link_split_section _bfd_generic_link_split_section #define bfd_pef_get_section_contents_in_window _bfd_generic_get_section_contents_in_window diff --git a/bfd/ppcboot.c b/bfd/ppcboot.c index 0d9a3bcdfa..853ee88fcf 100644 --- a/bfd/ppcboot.c +++ b/bfd/ppcboot.c @@ -480,6 +480,8 @@ ppcboot_bfd_print_private_bfd_data (abfd, farg) #define ppcboot_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define ppcboot_bfd_link_add_symbols _bfd_generic_link_add_symbols #define ppcboot_bfd_link_just_syms _bfd_generic_link_just_syms +#define ppcboot_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define ppcboot_bfd_final_link _bfd_generic_final_link #define ppcboot_bfd_link_split_section _bfd_generic_link_split_section #define ppcboot_get_section_contents_in_window \ diff --git a/bfd/som.c b/bfd/som.c index 0fb8e1de37..f259da8055 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -6343,6 +6343,8 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) #define som_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define som_bfd_link_add_symbols _bfd_generic_link_add_symbols #define som_bfd_link_just_syms _bfd_generic_link_just_syms +#define som_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define som_bfd_final_link _bfd_generic_final_link #define som_bfd_gc_sections bfd_generic_gc_sections #define som_bfd_merge_sections bfd_generic_merge_sections diff --git a/bfd/srec.c b/bfd/srec.c index d66fa6d99d..1251a7e93c 100644 --- a/bfd/srec.c +++ b/bfd/srec.c @@ -1261,6 +1261,8 @@ srec_print_symbol (bfd *abfd, #define srec_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols #define srec_bfd_link_just_syms _bfd_generic_link_just_syms +#define srec_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define srec_bfd_final_link _bfd_generic_final_link #define srec_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/targets.c b/bfd/targets.c index 31ec42f478..d9811a8010 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -436,6 +436,7 @@ BFD_JUMP_TABLE macros. . NAME##_bfd_link_hash_table_free, \ . NAME##_bfd_link_add_symbols, \ . NAME##_bfd_link_just_syms, \ +. NAME##_bfd_copy_link_hash_symbol_type, \ . NAME##_bfd_final_link, \ . NAME##_bfd_link_split_section, \ . NAME##_bfd_gc_sections, \ @@ -467,6 +468,12 @@ BFD_JUMP_TABLE macros. . {* Indicate that we are only retrieving symbol values from this section. *} . void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); . +. {* Copy the symbol type of a linker hash table entry. *} +.#define bfd_copy_link_hash_symbol_type(b, t, f) \ +. BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) +. void (*_bfd_copy_link_hash_symbol_type) +. (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); +. . {* Do a link based on the link_order structures attached to each . section of the BFD. *} . bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); diff --git a/bfd/tekhex.c b/bfd/tekhex.c index 0be3ab9675..bc3c9ca9bc 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -952,6 +952,8 @@ tekhex_print_symbol (bfd *abfd, #define tekhex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols #define tekhex_bfd_link_just_syms _bfd_generic_link_just_syms +#define tekhex_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define tekhex_bfd_final_link _bfd_generic_final_link #define tekhex_bfd_link_split_section _bfd_generic_link_split_section #define tekhex_get_section_contents_in_window _bfd_generic_get_section_contents_in_window diff --git a/bfd/versados.c b/bfd/versados.c index 8fbc17b8d3..f3de87188b 100644 --- a/bfd/versados.c +++ b/bfd/versados.c @@ -813,6 +813,8 @@ versados_canonicalize_reloc (bfd *abfd, #define versados_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols #define versados_bfd_link_just_syms _bfd_generic_link_just_syms +#define versados_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define versados_bfd_final_link _bfd_generic_final_link #define versados_bfd_link_split_section _bfd_generic_link_split_section diff --git a/bfd/vms.c b/bfd/vms.c index 61f485ed68..76b59b3809 100644 --- a/bfd/vms.c +++ b/bfd/vms.c @@ -140,6 +140,8 @@ static bfd_boolean vms_bfd_set_private_flags (bfd *abfd, flagword flags); #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false) #define vms_make_empty_symbol _bfd_generic_make_empty_symbol #define vms_bfd_link_just_syms _bfd_generic_link_just_syms +#define vms_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #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 diff --git a/bfd/xsym.c b/bfd/xsym.c index 706310ac61..dd1ffd7773 100644 --- a/bfd/xsym.c +++ b/bfd/xsym.c @@ -51,6 +51,8 @@ #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 #define bfd_sym_bfd_link_just_syms _bfd_generic_link_just_syms +#define bfd_sym_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define bfd_sym_bfd_final_link _bfd_generic_final_link #define bfd_sym_bfd_link_split_section _bfd_generic_link_split_section #define bfd_sym_get_section_contents_in_window _bfd_generic_get_section_contents_in_window diff --git a/ld/ChangeLog b/ld/ChangeLog index 31985e38f1..4a93d2c064 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2009-11-23 Paul Brook + + * ldexp.c: Copy symbol type for simple assignments. + 2009-11-20 Thomas Schwinge * emulparams/armelf.sh (OTHER_READONLY_SECTIONS) diff --git a/ld/ldexp.c b/ld/ldexp.c index 2d0382815f..7fdf7f4058 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -815,6 +815,20 @@ exp_fold_tree_1 (etree_type *tree) h->u.def.section = expld.result.section; if (tree->type.node_class == etree_provide) tree->type.node_class = etree_provided; + + /* Copy the symbol type if this is a simple assignment of + one symbol to annother. */ + if (tree->assign.src->type.node_class == etree_name) + { + struct bfd_link_hash_entry *hsrc; + + hsrc = bfd_link_hash_lookup (link_info.hash, + tree->assign.src->name.name, + FALSE, FALSE, TRUE); + if (hsrc) + bfd_copy_link_hash_symbol_type (link_info.output_bfd, h, + hsrc); + } } } break; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 91d3c7fa4b..537c2d6e8e 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-11-23 Paul Brook + + * ld-arm/script-type.sym: New test. + * ld-arm/script-type.s: New test. + * ld-arm/script-type.s: New test. + 2009-11-20 Thomas Schwinge * ld-arm/arm-dyn.ld: Adapt to main linker script changes. diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 21ec2254b6..8fbf8df29f 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -227,6 +227,9 @@ set armelftests { {"jump19" "-static -T arm.ld" "" {jump19.s} {{objdump -dr jump19.d}} "jump19"} + {"script-type" "-static -T script-type.ld" "" {script-type.s} + {{readelf -s script-type.sym}} + "script-type"} {"callweak" "-static -T arm.ld" "" {callweak.s} {{objdump -dr callweak.d}} "callweak"} diff --git a/ld/testsuite/ld-arm/script-type.ld b/ld/testsuite/ld-arm/script-type.ld new file mode 100644 index 0000000000..684fc97275 --- /dev/null +++ b/ld/testsuite/ld-arm/script-type.ld @@ -0,0 +1,7 @@ +SECTIONS { + foo_a = bar_a; + foo_t = bar_t; + foo_o = bar_o; + .text : { *(.text) } + .ARM.attribues 0 : { *(.ARM.attributes) } +} diff --git a/ld/testsuite/ld-arm/script-type.s b/ld/testsuite/ld-arm/script-type.s new file mode 100644 index 0000000000..f9d41e861c --- /dev/null +++ b/ld/testsuite/ld-arm/script-type.s @@ -0,0 +1,20 @@ +.syntax unified +.text +.global bar_a +.type bar_a %function +bar_a: +bx lr + +.p2align 4 +.global bar_o +.type bar_o %object +bar_o: +.word 0 + +.p2align 4 +.thumb +.global bar_t +.type bar_t %function +bar_t: +bx lr + diff --git a/ld/testsuite/ld-arm/script-type.sym b/ld/testsuite/ld-arm/script-type.sym new file mode 100644 index 0000000000..4e00da3d2f --- /dev/null +++ b/ld/testsuite/ld-arm/script-type.sym @@ -0,0 +1,15 @@ + +Symbol table '.symtab' contains 12 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 00000000 0 SECTION LOCAL DEFAULT 1 + 2: 00000000 0 SECTION LOCAL DEFAULT 2 + 3: 00000000 0 NOTYPE LOCAL DEFAULT 1 \$a + 4: 00000010 0 NOTYPE LOCAL DEFAULT 1 \$d + 5: 00000020 0 NOTYPE LOCAL DEFAULT 1 \$t + 6: 00000010 0 OBJECT GLOBAL DEFAULT 1 bar_o + 7: 00000021 0 FUNC GLOBAL DEFAULT 1 bar_t + 8: 00000000 0 FUNC GLOBAL DEFAULT 1 foo_a + 9: 00000021 0 FUNC GLOBAL DEFAULT 1 foo_t + 10: 00000010 0 OBJECT GLOBAL DEFAULT 1 foo_o + 11: 00000000 0 FUNC GLOBAL DEFAULT 1 bar_a -- 2.34.1