From 3b2175db9ad908f890b443275ded65876cd325d0 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Wed, 29 Jun 2005 13:16:44 +0000 Subject: [PATCH] 2005-06-29 Paul Brook * bfd-in.h (_bfd_elf_provide_symbol): Update prototype. * bfd-in2.h: Regenerate. * elf32-ppc.c (ppc_elf_set_sdata_syms): Make sdata symbols section relative. * elflink.c (bfd_elf_set_symbol): Add section argument. (_bfd_elf_provide_symbol): Ditto. (_bfd_elf_provide_section_bound_symbols): Pass NULL section argument. --- bfd/ChangeLog | 10 ++++++++++ bfd/bfd-in.h | 2 +- bfd/bfd-in2.h | 2 +- bfd/elf32-ppc.c | 40 +++++++++++++++++++++++++++------------- bfd/elflink.c | 16 +++++++++------- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ed9284a0f15..539b3499a0e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2005-06-29 Paul Brook + + * bfd-in.h (_bfd_elf_provide_symbol): Update prototype. + * bfd-in2.h: Regenerate. + * elf32-ppc.c (ppc_elf_set_sdata_syms): Make sdata symbols section + relative. + * elflink.c (bfd_elf_set_symbol): Add section argument. + (_bfd_elf_provide_symbol): Ditto. + (_bfd_elf_provide_section_bound_symbols): Pass NULL section argument. + 2005-06-27 Carlos O'Donell * bfd/elf32-hppa.c (struct elf32_hppa_stub_hash_entry): diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 51a21f8e73d..b8c4ef89eba 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -698,7 +698,7 @@ extern struct bfd_section *_bfd_elf_tls_setup (bfd *, struct bfd_link_info *); extern void _bfd_elf_provide_symbol - (struct bfd_link_info *, const char *, bfd_vma); + (struct bfd_link_info *, const char *, bfd_vma, struct bfd_section *); extern void _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *, struct bfd_section *sec, const char *, const char *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 1107dc48dd6..a1ca9588986 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -705,7 +705,7 @@ extern struct bfd_section *_bfd_elf_tls_setup (bfd *, struct bfd_link_info *); extern void _bfd_elf_provide_symbol - (struct bfd_link_info *, const char *, bfd_vma); + (struct bfd_link_info *, const char *, bfd_vma, struct bfd_section *); extern void _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *, struct bfd_section *sec, const char *, const char *); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 1d86b483061..4f1eec9f11f 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5108,24 +5108,38 @@ ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info) if (s == NULL) s = bfd_get_section_by_name (obfd, lsect->bss_name); - val = 0; - if (s != NULL) - val = s->vma + 32768; - lsect->sym_val = val; + if (s) + { + /* VxWorks executables are relocatable, so the sdata base symbols + must be section-relative. If the section is zero sized leave + them as absolute symbols to avoid creationg an unused + output section. */ + val = 32768; + lsect->sym_val = val + s->vma; + if (s->size == 0) + { + val += s->vma; + s = NULL; + } + } + else + { + val = 0; + lsect->sym_val = 0; + } - _bfd_elf_provide_symbol (info, lsect->sym_name, val); + _bfd_elf_provide_symbol (info, lsect->sym_name, val, s); } s = bfd_get_section_by_name (obfd, ".sbss"); - val = 0; - if (s != NULL) - val = s->vma; - _bfd_elf_provide_symbol (info, "__sbss_start", val); - _bfd_elf_provide_symbol (info, "___sbss_start", val); + _bfd_elf_provide_symbol (info, "__sbss_start", 0, NULL); + _bfd_elf_provide_symbol (info, "___sbss_start", 0, NULL); if (s != NULL) - val += s->size; - _bfd_elf_provide_symbol (info, "__sbss_end", val); - _bfd_elf_provide_symbol (info, "___sbss_end", val); + val = s->size; + else + val = 0; + _bfd_elf_provide_symbol (info, "__sbss_end", val, s); + _bfd_elf_provide_symbol (info, "___sbss_end", val, s); return TRUE; } diff --git a/bfd/elflink.c b/bfd/elflink.c index e404d3b644f..0a70c2345e2 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -9792,10 +9792,11 @@ _bfd_elf_section_already_linked (bfd *abfd, struct bfd_section * sec) } static void -bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val) +bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val, + struct bfd_section *s) { h->root.type = bfd_link_hash_defined; - h->root.u.def.section = bfd_abs_section_ptr; + h->root.u.def.section = s ? s : bfd_abs_section_ptr; h->root.u.def.value = val; h->def_regular = 1; h->type = STT_OBJECT; @@ -9803,11 +9804,12 @@ bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val) h->forced_local = 1; } -/* Set NAME to VAL if the symbol exists and is undefined. */ +/* Set NAME to VAL if the symbol exists and is undefined. If val is NULL + it is an absolute symbol, otherwise it is relative to that section. */ void _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, - bfd_vma val) + bfd_vma val, struct bfd_section *s) { struct elf_link_hash_entry *h; @@ -9815,7 +9817,7 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, FALSE); if (h != NULL && (h->root.type == bfd_link_hash_undefined || h->root.type == bfd_link_hash_undefweak)) - bfd_elf_set_symbol (h, val); + bfd_elf_set_symbol (h, val, s); } /* Set START and END to boundaries of SEC if they exist and are @@ -9868,8 +9870,8 @@ _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info, } if (do_start) - bfd_elf_set_symbol (hs, start_val); + bfd_elf_set_symbol (hs, start_val, NULL); if (do_end) - bfd_elf_set_symbol (he, end_val); + bfd_elf_set_symbol (he, end_val, NULL); } -- 2.30.2