a5ed0c7d14
- Fix --gc-sections failure with symbol versioning [bso#13195] (this indirectly fixes build of openSUSE:Factory:ARM/busybox, BTW) OBS-URL: https://build.opensuse.org/request/show/85857 OBS-URL: https://build.opensuse.org/package/show/devel:gcc/binutils?expand=0&rev=71
108 lines
3.0 KiB
Diff
108 lines
3.0 KiB
Diff
Index: bfd/elflink.c
|
|
===================================================================
|
|
--- bfd/elflink.c.orig
|
|
+++ bfd/elflink.c
|
|
@@ -1238,7 +1238,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
|
{
|
|
h->def_dynamic = 0;
|
|
h->ref_dynamic = 1;
|
|
- h->dynamic_def = 1;
|
|
}
|
|
/* FIXME: Should we check type and size for protected symbol? */
|
|
h->size = 0;
|
|
@@ -4353,7 +4352,6 @@ error_free_dyn:
|
|
{
|
|
h->def_dynamic = 0;
|
|
h->ref_dynamic = 1;
|
|
- h->dynamic_def = 1;
|
|
}
|
|
}
|
|
if (! info->executable
|
|
@@ -4366,7 +4364,10 @@ error_free_dyn:
|
|
if (! definition)
|
|
h->ref_dynamic = 1;
|
|
else
|
|
- h->def_dynamic = 1;
|
|
+ {
|
|
+ h->def_dynamic = 1;
|
|
+ h->dynamic_def = 1;
|
|
+ }
|
|
if (h->def_regular
|
|
|| h->ref_regular
|
|
|| (h->u.weakdef != NULL
|
|
@@ -11914,8 +11915,9 @@ bfd_elf_gc_mark_dynamic_ref_symbol (stru
|
|
&& h->def_regular
|
|
&& ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
|
|
&& ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
|
|
- && !bfd_hide_sym_by_version (info->version_info,
|
|
- h->root.root.string))))
|
|
+ && (strchr (h->root.root.string, ELF_VER_CHR) != NULL
|
|
+ || !bfd_hide_sym_by_version (info->version_info,
|
|
+ h->root.root.string)))))
|
|
h->root.u.def.section->flags |= SEC_KEEP;
|
|
|
|
return TRUE;
|
|
Index: ld/testsuite/ld-elf/elf.exp
|
|
===================================================================
|
|
--- ld/testsuite/ld-elf/elf.exp.orig
|
|
+++ ld/testsuite/ld-elf/elf.exp
|
|
@@ -138,6 +138,11 @@ if ![isnative] {
|
|
return
|
|
}
|
|
|
|
+run_cc_link_tests {
|
|
+ {"PR ld/13195" "-Wl,--gc-sections" ""
|
|
+ {pr13195.c} {} "pr13195"}
|
|
+}
|
|
+
|
|
set array_tests {
|
|
{"preinit array" "" "" {preinit.c} "preinit" "preinit.out"}
|
|
{"init array" "" "" {init.c} "init" "init.out"}
|
|
Index: ld/testsuite/ld-elf/pr13195.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ ld/testsuite/ld-elf/pr13195.c
|
|
@@ -0,0 +1,5 @@
|
|
+int
|
|
+main ()
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
Index: ld/testsuite/ld-elf/pr13195.d
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ ld/testsuite/ld-elf/pr13195.d
|
|
@@ -0,0 +1,10 @@
|
|
+#ld: --gc-sections -shared -version-script pr13195.t
|
|
+#readelf: -s --wide -D
|
|
+#target: *-*-linux* *-*-gnu*
|
|
+#notarget: arc-*-* d30v-*-* dlx-*-* i960-*-* or32-*-* pj*-*-*
|
|
+#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
|
|
+# generic linker targets don't support --gc-sections, nor do a bunch of others
|
|
+
|
|
+#...
|
|
+ +[0-9]+ +[0-9]+: +[0-9a-f]+ +[0-9]+ +FUNC +GLOBAL +DEFAULT +[1-9]+ foo
|
|
+#pass
|
|
Index: ld/testsuite/ld-elf/pr13195.s
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ ld/testsuite/ld-elf/pr13195.s
|
|
@@ -0,0 +1,6 @@
|
|
+ .section .text.new_foo,"ax",%progbits
|
|
+ .globl new_foo
|
|
+ .type new_foo, %function
|
|
+new_foo:
|
|
+ .byte 0
|
|
+ .symver new_foo,foo@@VERS_2.0
|
|
Index: ld/testsuite/ld-elf/pr13195.t
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ ld/testsuite/ld-elf/pr13195.t
|
|
@@ -0,0 +1,6 @@
|
|
+VERS_2.0 {
|
|
+global:
|
|
+ foo;
|
|
+local:
|
|
+ *;
|
|
+};
|