aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2005-06-29 13:16:44 +0000
committerPaul Brook <paul@codesourcery.com>2005-06-29 13:16:44 +0000
commit3b2175db9ad908f890b443275ded65876cd325d0 (patch)
tree2c6db626d527b5563691bcf839d3dc2ad23c69c8
parentf7e69b447f96744bdaaf3d635fe6cc02b3c2c9e1 (diff)
downloadgdb-3b2175db9ad908f890b443275ded65876cd325d0.zip
gdb-3b2175db9ad908f890b443275ded65876cd325d0.tar.gz
gdb-3b2175db9ad908f890b443275ded65876cd325d0.tar.bz2
2005-06-29 Paul Brook <paul@codesourcery.com>
* 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.
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/bfd-in.h2
-rw-r--r--bfd/bfd-in2.h2
-rw-r--r--bfd/elf32-ppc.c40
-rw-r--r--bfd/elflink.c16
5 files changed, 48 insertions, 22 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ed9284a..539b3499 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2005-06-29 Paul Brook <paul@codesourcery.com>
+
+ * 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 <carlos@systemhalted.org>
* bfd/elf32-hppa.c (struct elf32_hppa_stub_hash_entry):
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index 51a21f8..b8c4ef8 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 1107dc4..a1ca958 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 1d86b48..4f1eec9 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 e404d3b..0a70c23 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);
}