This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH: Add _bfd_elf_provide_symbol
On Tue, Mar 22, 2005 at 12:49:03PM -0800, H. J. Lu wrote:
> On Tue, Mar 22, 2005 at 09:07:58AM -0800, H. J. Lu wrote:
> > On Tue, Mar 22, 2005 at 03:33:14PM +1030, Alan Modra wrote:
> > > >
> > > > We had the same problem with __XXX_array_start/__XXX_array_end. I am
> > > > running into the same problem for a different issue. Can we can make
> > > > this a generic ELF function:
> > > >
> > > > void bfd_elf_provide_symbol (struct bfd_link_info *,
> > > > const char *sym_name,
> > > > asection *sec,
> > > > bfd_vma val);
> > > >
> > > > It will define a hidden data symbol NAME defined in SEC with value VAL
> > > > if it is undefined.
> > >
> > > If you need it, go ahead and steal it. :) The function probably ought
> > > to start with '_' to indicate that it's not part of the public bfd
> > > interface.
> > >
> >
> > Here is the patch. I call it from gld${EMULATION_NAME}_finish and
> > it works for me. Is this the best place to do it?
> >
> >
>
> Here is an updated patch. We don't need those symbols for ld -r.
>
>
Here is an upated patch. _bfd_elf_provide_symbol should presever
st_other. Also it needs to set forced_local to 1. Otherwise, we will
get global hidden symbols. We don't need those array symbols for
shared libraries.
H.J.
----
bfd/
2005-03-22 H.J. Lu <hongjiu.lu@intel.com>
* bfd-in.h (_bfd_elf_provide_symbol): New.
* bfd-in2.h: Regenerated.
* elf32-ppc.c (set_linker_sym): Moved to elflink.c.
(ppc_elf_set_sdata_syms): Call _bfd_elf_provide_symbol instead
of set_linker_sym.
* elflink.c (_bfd_elf_provide_symbol): New. Moved and renamed
from elf32-ppc.c.
ld/
2005-03-22 H.J. Lu <hongjiu.lu@intel.com>
* emultempl/elf32.em (gld${EMULATION_NAME}_provide_array_symbols): New
(gld${EMULATION_NAME}_finish): Call
gld${EMULATION_NAME}_provide_array_symbols to provide
__preinit_array_start, __preinit_array_end, __init_array_start,
__init_array_end, __fini_array_start and __fini_array_end.
* scripttempl/elf.sc: Don't provide __preinit_array_start,
__preinit_array_end, __init_array_start, __init_array_end,
__fini_array_start nor __fini_array_end.
--- binutils/bfd/bfd-in.h.provide 2005-02-21 11:10:29.000000000 -0800
+++ binutils/bfd/bfd-in.h 2005-03-22 12:52:00.000000000 -0800
@@ -694,6 +694,9 @@ extern int bfd_get_sign_extend_vma
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);
+
extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);
--- binutils/bfd/elf32-ppc.c.provide 2005-03-22 07:14:43.000000000 -0800
+++ binutils/bfd/elf32-ppc.c 2005-03-22 12:52:00.000000000 -0800
@@ -4545,26 +4545,6 @@ ppc_elf_relax_section (bfd *abfd,
return FALSE;
}
-/* Set SYM_NAME to VAL if the symbol exists and is undefined. */
-
-static void
-set_linker_sym (struct ppc_elf_link_hash_table *htab,
- const char *sym_name,
- bfd_vma val)
-{
- struct elf_link_hash_entry *h;
- h = elf_link_hash_lookup (&htab->elf, sym_name, FALSE, FALSE, FALSE);
- if (h != NULL && h->root.type == bfd_link_hash_undefined)
- {
- h->root.type = bfd_link_hash_defined;
- h->root.u.def.section = bfd_abs_section_ptr;
- h->root.u.def.value = val;
- h->def_regular = 1;
- h->type = STT_OBJECT;
- h->other = STV_HIDDEN;
- }
-}
-
/* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms. They are
set here rather than via PROVIDE in the default linker script,
because using PROVIDE inside an output section statement results in
@@ -4599,19 +4579,19 @@ ppc_elf_set_sdata_syms (bfd *obfd, struc
val = s->vma + 32768;
lsect->sym_val = val;
- set_linker_sym (htab, lsect->sym_name, val);
+ _bfd_elf_provide_symbol (info, lsect->sym_name, val);
}
s = bfd_get_section_by_name (obfd, ".sbss");
val = 0;
if (s != NULL)
val = s->vma;
- set_linker_sym (htab, "__sbss_start", val);
- set_linker_sym (htab, "___sbss_start", val);
+ _bfd_elf_provide_symbol (info, "__sbss_start", val);
+ _bfd_elf_provide_symbol (info, "___sbss_start", val);
if (s != NULL)
val += s->size;
- set_linker_sym (htab, "__sbss_end", val);
- set_linker_sym (htab, "___sbss_end", val);
+ _bfd_elf_provide_symbol (info, "__sbss_end", val);
+ _bfd_elf_provide_symbol (info, "___sbss_end", val);
return TRUE;
}
--- binutils/bfd/elflink.c.provide 2005-03-22 07:14:45.000000000 -0800
+++ binutils/bfd/elflink.c 2005-03-22 14:31:19.054207031 -0800
@@ -9754,3 +9754,24 @@ _bfd_elf_section_already_linked (bfd *ab
/* This is the first section with this name. Record it. */
bfd_section_already_linked_table_insert (already_linked_list, sec);
}
+
+/* Set NAME to VAL if the symbol exists and is undefined. */
+
+void
+_bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
+ bfd_vma val)
+{
+ struct elf_link_hash_entry *h;
+ h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE,
+ FALSE);
+ if (h != NULL && h->root.type == bfd_link_hash_undefined)
+ {
+ h->root.type = bfd_link_hash_defined;
+ h->root.u.def.section = bfd_abs_section_ptr;
+ h->root.u.def.value = val;
+ h->def_regular = 1;
+ h->type = STT_OBJECT;
+ h->other = STV_HIDDEN | (h->other & ~ ELF_ST_VISIBILITY (-1));
+ h->forced_local = 1;
+ }
+}
--- binutils/ld/emultempl/elf32.em.provide 2005-03-22 07:15:14.000000000 -0800
+++ binutils/ld/emultempl/elf32.em 2005-03-22 14:43:13.316089374 -0800
@@ -1428,6 +1428,29 @@ if test x"$LDEMUL_FINISH" != xgld"$EMULA
cat >>e${EMULATION_NAME}.c <<EOF
static void
+gld${EMULATION_NAME}_provide_array_symbols (const char *sec,
+ const char *start,
+ const char *end)
+{
+ asection *s;
+ bfd_vma start_val, end_val;
+
+ s = bfd_get_section_by_name (output_bfd, sec);
+ if (s != NULL)
+ {
+ start_val = s->vma;
+ end_val = start_val + s->size;
+ }
+ else
+ {
+ start_val = 0;
+ end_val = 0;
+ }
+ _bfd_elf_provide_symbol (&link_info, start, start_val);
+ _bfd_elf_provide_symbol (&link_info, end, end_val);
+}
+
+static void
gld${EMULATION_NAME}_finish (void)
{
if (bfd_elf_discard_info (output_bfd, &link_info))
@@ -1472,6 +1495,34 @@ gld${EMULATION_NAME}_finish (void)
}
}
}
+
+ /* If not building shared library, provide
+
+ __preinit_array_start
+ __preinit_array_end
+ __init_array_start
+ __init_array_end
+ __fini_array_start
+ __fini_array_end
+
+ They are set here rather than via PROVIDE in the linker
+ script, because using PROVIDE inside an output section
+ statement results in unnecessary output sections. Using
+ PROVIDE outside an output section statement runs the risk of
+ section alignment affecting where the section starts. */
+
+ if (!link_info.shared)
+ {
+ gld${EMULATION_NAME}_provide_array_symbols
+ (".preinit_array", "__preinit_array_start",
+ "__preinit_array_end");
+ gld${EMULATION_NAME}_provide_array_symbols
+ (".init_array", "__init_array_start",
+ "__init_array_end");
+ gld${EMULATION_NAME}_provide_array_symbols
+ (".fini_array", "__fini_array_start",
+ "__fini_array_end");
+ }
}
}
EOF
--- binutils/ld/scripttempl/elf.sc.provide 2005-03-21 13:13:41.000000000 -0800
+++ binutils/ld/scripttempl/elf.sc 2005-03-22 12:52:00.000000000 -0800
@@ -333,22 +333,9 @@ cat <<EOF
.tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
.tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
- /* Ensure the __preinit_array_start label is properly aligned. We
- could instead move the label definition inside the section, but
- the linker would then create the section even if it turns out to
- be empty, which isn't pretty. */
- ${RELOCATING+. = ALIGN(${ALIGNMENT});}
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}}
.preinit_array ${RELOCATING-0} : { KEEP (*(.preinit_array)) }
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}}
-
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
.init_array ${RELOCATING-0} : { KEEP (*(.init_array)) }
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
-
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
.fini_array ${RELOCATING-0} : { KEEP (*(.fini_array)) }
- ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}