aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-07-14 13:54:23 +0000
committerAlan Modra <amodra@gmail.com>2005-07-14 13:54:23 +0000
commita3c2b96af6bbf3ab11d9f5532093c8c3c346df4a (patch)
tree3dd2957dd59a3b39e4a89b121783842534195ddc /bfd
parentbfaaa3c28b9c0ada4c322c895e4cf1349abfd10d (diff)
downloadgdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.zip
gdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.tar.gz
gdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.tar.bz2
bfd/
* bfd-in.h (_bfd_elf_fix_excluded_sec_syms): Declare. (_bfd_elf_provide_section_bound_symbols): Remove param name. Formatting. * bfd-in2.h: Regenerate. * elflink.c (bfd_elf_gc_sections): Don't call generic function. (_bfd_elf_provide_symbol): Formatting. (_bfd_elf_provide_section_bound_symbols): Remove all hacks, just create section relative syms. (fix_syms, _bfd_elf_fix_excluded_sec_syms): New functions. * elf32-ppc.c (ppc_elf_set_sdata_syms): Use _bfd_elf_provide_section_bound_symbols. * reloc.c (bfd_mark_used_section): Delete. (bfd_generic_gc_sections): Don't call the above. ld/ * ldlang.c (strip_excluded_output_sections): Don't call bfd_gc_sections. * emultempl/elf32.em (gld*_provide_bound_symbols): Move. (gld*_provide_init_fini_syms): Move. (gld*_before_allocation): Call the above from here.. (gld*_finish): ..not here. Call _bfd_elf_fix_excluded_sec_syms. * emultempl/hppaelf.em (hppaelf_finish): Likewise. * emultempl/ppc64elf.em (ppc_finish): Likewise.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog20
-rw-r--r--bfd/bfd-in.h11
-rw-r--r--bfd/bfd-in2.h11
-rw-r--r--bfd/elf32-ppc.c11
-rw-r--r--bfd/elflink.c68
-rw-r--r--bfd/reloc.c30
6 files changed, 70 insertions, 81 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ddb07b7..17d27fa 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,19 @@
+2005-07-14 Alan Modra <amodra@bigpond.net.au>
+
+ * bfd-in.h (_bfd_elf_fix_excluded_sec_syms): Declare.
+ (_bfd_elf_provide_section_bound_symbols): Remove param name.
+ Formatting.
+ * bfd-in2.h: Regenerate.
+ * elflink.c (bfd_elf_gc_sections): Don't call generic function.
+ (_bfd_elf_provide_symbol): Formatting.
+ (_bfd_elf_provide_section_bound_symbols): Remove all hacks, just
+ create section relative syms.
+ (fix_syms, _bfd_elf_fix_excluded_sec_syms): New functions.
+ * elf32-ppc.c (ppc_elf_set_sdata_syms): Use
+ _bfd_elf_provide_section_bound_symbols.
+ * reloc.c (bfd_mark_used_section): Delete.
+ (bfd_generic_gc_sections): Don't call the above.
+
2005-07-14 Paul Woegerer <paul.woegerer@nsc.com>
PR 1063
@@ -10,7 +26,7 @@
Alpha binaries and issue a helpful error message.
(alpha_ecoff_swap_reloc_out): Increase maximum allowed internal
symbol index to 15 to allow for binaries produced by DEC
- compilers.
+ compilers.
2005-07-13 Steve Ellcey <sje@cup.hp.com>
@@ -42,7 +58,7 @@
2005-07-08 Ralf Corsepius <ralf.corsepius@rtems.org>
* config.bfd: Mark i960-*-rtems*, or32-*-rtems* as obsolete.
- Mark a29k-*rtems*, hppa*-*-rtems*, *-go32-rtems*,
+ Mark a29k-*rtems*, hppa*-*-rtems*, *-go32-rtems*,
i[3-7]86*-*-rtemscoff*, mips*el-*-rtems*, powerpcle-*-rtems*,
sparc*-*-rtemsaout* as removed
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index 4d999b9..34188d1 100644
--- a/bfd/bfd-in.h
+++ b/bfd/bfd-in.h
@@ -704,10 +704,14 @@ extern void _bfd_elf_provide_symbol
(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 *);
+ (struct bfd_link_info *, struct bfd_section *, const char *, const char *);
+
+extern void _bfd_elf_fix_excluded_sec_syms
+ (bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
- (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);
+ (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *,
+ char **);
/* SunOS shared library support routines for the linker. */
@@ -716,7 +720,8 @@ extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
extern bfd_boolean bfd_sunos_record_link_assignment
(bfd *, struct bfd_link_info *, const char *);
extern bfd_boolean bfd_sunos_size_dynamic_sections
- (bfd *, struct bfd_link_info *, struct bfd_section **, struct bfd_section **, struct bfd_section **);
+ (bfd *, struct bfd_link_info *, struct bfd_section **,
+ struct bfd_section **, struct bfd_section **);
/* Linux shared library support routines for the linker. */
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index ada5e0e..0073c12 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -711,10 +711,14 @@ extern void _bfd_elf_provide_symbol
(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 *);
+ (struct bfd_link_info *, struct bfd_section *, const char *, const char *);
+
+extern void _bfd_elf_fix_excluded_sec_syms
+ (bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
- (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);
+ (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *,
+ char **);
/* SunOS shared library support routines for the linker. */
@@ -723,7 +727,8 @@ extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
extern bfd_boolean bfd_sunos_record_link_assignment
(bfd *, struct bfd_link_info *, const char *);
extern bfd_boolean bfd_sunos_size_dynamic_sections
- (bfd *, struct bfd_link_info *, struct bfd_section **, struct bfd_section **, struct bfd_section **);
+ (bfd *, struct bfd_link_info *, struct bfd_section **,
+ struct bfd_section **, struct bfd_section **);
/* Linux shared library support routines for the linker. */
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 9b306e5..d4ef612 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -5307,13 +5307,10 @@ ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
}
s = bfd_get_section_by_name (obfd, ".sbss");
- val = 0;
- _bfd_elf_provide_symbol (info, "__sbss_start", val, s);
- _bfd_elf_provide_symbol (info, "___sbss_start", val, s);
- if (s != NULL)
- val = s->size;
- _bfd_elf_provide_symbol (info, "__sbss_end", val, s);
- _bfd_elf_provide_symbol (info, "___sbss_end", val, s);
+ _bfd_elf_provide_section_bound_symbols (info, s,
+ "__sbss_start", "__sbss_end");
+ _bfd_elf_provide_section_bound_symbols (info, s,
+ "___sbss_start", "___sbss_end");
return TRUE;
}
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 6177f53..791575b 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -9119,9 +9119,6 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
(asection *, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
- if (!info->gc_sections)
- return bfd_generic_gc_sections (abfd, info);
-
if (!get_elf_backend_data (abfd)->can_gc_sections
|| info->relocatable
|| info->emitrelocations
@@ -9846,8 +9843,7 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
{
struct elf_link_hash_entry *h;
- h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE,
- FALSE);
+ h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE);
if (h != NULL && !h->def_regular)
bfd_elf_set_symbol (h, val, s);
}
@@ -9861,45 +9857,41 @@ _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info,
const char *start,
const char *end)
{
- struct elf_link_hash_entry *hs, *he;
- bfd_vma start_val, end_val;
- bfd_boolean do_start, do_end;
+ bfd_vma val = 0;
+ _bfd_elf_provide_symbol (info, start, val, sec);
+ if (sec != NULL)
+ val = sec->size;
+ _bfd_elf_provide_symbol (info, end, val, sec);
+}
- /* Check if we need them or not first. */
- hs = elf_link_hash_lookup (elf_hash_table (info), start, FALSE,
- FALSE, FALSE);
- do_start = hs != NULL && !hs->def_regular;
+/* Convert symbols in excluded output sections to absolute. */
- he = elf_link_hash_lookup (elf_hash_table (info), end, FALSE,
- FALSE, FALSE);
- do_end = he != NULL && !he->def_regular;
+static bfd_boolean
+fix_syms (struct bfd_link_hash_entry *h, void *data)
+{
+ bfd *obfd = (bfd *) data;
- if (!do_start && !do_end)
- return;
+ if (h->type == bfd_link_hash_warning)
+ h = h->u.i.link;
- if (sec != NULL)
+ if (h->type == bfd_link_hash_defined
+ || h->type == bfd_link_hash_defweak)
{
- start_val = sec->vma;
- end_val = start_val + sec->size;
- }
- else
- {
- /* We have to choose those values very carefully. Some targets,
- like alpha, may have relocation overflow with 0. "__bss_start"
- should be defined in all cases. */
- struct elf_link_hash_entry *h
- = elf_link_hash_lookup (elf_hash_table (info), "__bss_start",
- FALSE, FALSE, FALSE);
- if (h != NULL && h->root.type == bfd_link_hash_defined)
- start_val = h->root.u.def.value;
- else
- start_val = 0;
- end_val = start_val;
+ asection *s = h->u.def.section;
+ if (s != NULL
+ && s == s->output_section
+ && bfd_section_removed_from_list (obfd, s))
+ {
+ h->u.def.value += s->vma;
+ h->u.def.section = bfd_abs_section_ptr;
+ }
}
- if (do_start)
- bfd_elf_set_symbol (hs, start_val, NULL);
+ return TRUE;
+}
- if (do_end)
- bfd_elf_set_symbol (he, end_val, NULL);
+void
+_bfd_elf_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info)
+{
+ bfd_link_hash_traverse (info->hash, fix_syms, obfd);
}
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 1b15e6a..9d10d25 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -4520,27 +4520,6 @@ bfd_generic_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
return TRUE;
}
-/* Mark sections containing global symbols. This is called through
- bfd_link_hash_traverse. */
-
-static bfd_boolean
-bfd_mark_used_section (struct bfd_link_hash_entry *h,
- void *data ATTRIBUTE_UNUSED)
-{
- if (h->type == bfd_link_hash_warning)
- h = h->u.i.link;
-
- if (h->type == bfd_link_hash_defined
- || h->type == bfd_link_hash_defweak)
- {
- asection *s = h->u.def.section;
- if (s != NULL && s->output_section != NULL)
- s->output_section->flags |= SEC_KEEP;
- }
-
- return TRUE;
-}
-
/*
INTERNAL_FUNCTION
bfd_generic_gc_sections
@@ -4551,18 +4530,13 @@ SYNOPSIS
DESCRIPTION
Provides default handling for relaxing for back ends which
- don't do section gc -- i.e., does nothing besides the special
- case for marking sections having global symbols.
+ don't do section gc -- i.e., does nothing.
*/
bfd_boolean
bfd_generic_gc_sections (bfd *abfd ATTRIBUTE_UNUSED,
- struct bfd_link_info *info)
+ struct bfd_link_info *info ATTRIBUTE_UNUSED)
{
- /* If called when info->gc_sections is 0, then mark all sections
- containing global symbols with SEC_KEEP. */
- if (!info->gc_sections && !info->relocatable)
- bfd_link_hash_traverse (info->hash, bfd_mark_used_section, NULL);
return TRUE;
}