ELF: Properly handle section symbols
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 10 Jun 2020 12:31:19 +0000 (05:31 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 10 Jun 2020 12:31:31 +0000 (05:31 -0700)
When defining the section symbol, __start_FOO, for the section FOO:

1. Treat the common symbol, __start_FOO, in input object file as
definition.
2. Clear verinfo.verdef.

bfd/

PR ld/26094
* elflink.c (bfd_elf_define_start_stop): Handle common symbols.
Clear verinfo.verdef.

ld/

PR ld/26094
* testsuite/ld-elf/pr26094-1.ver: New fike.
* testsuite/ld-elf/pr26094-1a.c: Likewise.
* testsuite/ld-elf/pr26094-1a.rd: Likewise.
* testsuite/ld-elf/pr26094-1b.c: Likewise.
* testsuite/ld-elf/pr26094-1b.rd: Likewise.
* testsuite/ld-elf/pr26094-1c.c: Likewise.
* testsuite/ld-elf/shared.exp: Run ld/26094 tests.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/pr26094-1.ver [new file with mode: 0644]
ld/testsuite/ld-elf/pr26094-1a.c [new file with mode: 0644]
ld/testsuite/ld-elf/pr26094-1a.rd [new file with mode: 0644]
ld/testsuite/ld-elf/pr26094-1b.c [new file with mode: 0644]
ld/testsuite/ld-elf/pr26094-1b.rd [new file with mode: 0644]
ld/testsuite/ld-elf/pr26094-1c.c [new file with mode: 0644]
ld/testsuite/ld-elf/shared.exp

index 8f9e69c6c71108425f179e31a8697635f6e4bc2f..928d4bddaf45e5e67b29cdd25d2733f53bb85594 100644 (file)
@@ -1,3 +1,9 @@
+2020-06-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26094
+       * elflink.c (bfd_elf_define_start_stop): Handle common symbols.
+       Clear verinfo.verdef.
+
 2020-06-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/18801
index 60a3c2216f3f10f26c90ae3cccdb88fe65b74411..3e56a297f69833ca5c12df61e9fd7d721d33fb8d 100644 (file)
@@ -14802,12 +14802,16 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
 
   h = elf_link_hash_lookup (elf_hash_table (info), symbol,
                            FALSE, FALSE, TRUE);
+  /* NB: Common symbols will be turned into definition later.  */
   if (h != NULL
       && (h->root.type == bfd_link_hash_undefined
          || h->root.type == bfd_link_hash_undefweak
-         || ((h->ref_regular || h->def_dynamic) && !h->def_regular)))
+         || ((h->ref_regular || h->def_dynamic)
+             && !h->def_regular
+             && h->root.type != bfd_link_hash_common)))
     {
       bfd_boolean was_dynamic = h->ref_dynamic || h->def_dynamic;
+      h->verinfo.verdef = NULL;
       h->root.type = bfd_link_hash_defined;
       h->root.u.def.section = sec;
       h->root.u.def.value = 0;
index ba4151ee833fdf6ef1926c90b4a2d470b76c3c03..74636bbb7c887b94bbbfca072c078e4c7180b013 100644 (file)
@@ -1,3 +1,14 @@
+2020-06-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26094
+       * testsuite/ld-elf/pr26094-1.ver: New fike.
+       * testsuite/ld-elf/pr26094-1a.c: Likewise.
+       * testsuite/ld-elf/pr26094-1a.rd: Likewise.
+       * testsuite/ld-elf/pr26094-1b.c: Likewise.
+       * testsuite/ld-elf/pr26094-1b.rd: Likewise.
+       * testsuite/ld-elf/pr26094-1c.c: Likewise.
+       * testsuite/ld-elf/shared.exp: Run ld/26094 tests.
+
 2020-06-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/18801
diff --git a/ld/testsuite/ld-elf/pr26094-1.ver b/ld/testsuite/ld-elf/pr26094-1.ver
new file mode 100644 (file)
index 0000000..eda3854
--- /dev/null
@@ -0,0 +1,3 @@
+SOME_VERSION_NAME {
+        global: *;
+};
diff --git a/ld/testsuite/ld-elf/pr26094-1a.c b/ld/testsuite/ld-elf/pr26094-1a.c
new file mode 100644 (file)
index 0000000..7a80215
--- /dev/null
@@ -0,0 +1,7 @@
+char foo_data  __attribute__(( section("FOO") )) = { 0 };
+
+extern void * __start_FOO;
+
+void * foo() {
+    return  __start_FOO;
+}
diff --git a/ld/testsuite/ld-elf/pr26094-1a.rd b/ld/testsuite/ld-elf/pr26094-1a.rd
new file mode 100644 (file)
index 0000000..0e7bdde
--- /dev/null
@@ -0,0 +1,8 @@
+#ld: -shared
+#readelf: --dyn-syms --wide
+#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
+#xfail: ![check_shared_lib_support]
+
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +NOTYPE +GLOBAL +PROTECTED +[0-9]+ +___?start_FOO@@SOME_VERSION_NAME
+#pass
diff --git a/ld/testsuite/ld-elf/pr26094-1b.c b/ld/testsuite/ld-elf/pr26094-1b.c
new file mode 100644 (file)
index 0000000..650a36f
--- /dev/null
@@ -0,0 +1,6 @@
+extern void *foo();
+
+void main()
+{
+    foo();
+}
\ No newline at end of file
diff --git a/ld/testsuite/ld-elf/pr26094-1b.rd b/ld/testsuite/ld-elf/pr26094-1b.rd
new file mode 100644 (file)
index 0000000..ec0c13d
--- /dev/null
@@ -0,0 +1,8 @@
+#ld:
+#readelf: --dyn-syms --wide
+#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
+#xfail: ![check_shared_lib_support]
+
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +OBJECT +GLOBAL +PROTECTED +[0-9]+ +___?start_FOO@@SOME_VERSION_NAME
+#pass
diff --git a/ld/testsuite/ld-elf/pr26094-1c.c b/ld/testsuite/ld-elf/pr26094-1c.c
new file mode 100644 (file)
index 0000000..782f493
--- /dev/null
@@ -0,0 +1,7 @@
+char foo_data  __attribute__(( section("FOO") )) = { 0 };
+
+void * __start_FOO;
+
+void * foo() {
+    return  __start_FOO;
+}
index b1e1f62d50e03a3caa3b8b48e0fe118f5afd6ff1..9d72cad78d6c326644821192e9f395cce4df02b0 100644 (file)
@@ -832,6 +832,25 @@ append build_tests {
 
 run_cc_link_tests $build_tests
 
+run_cc_link_tests [list \
+    [list \
+       "Build pr26094-1.so" \
+       "-shared -Wl,--version-script=pr26094-1.ver" \
+       "-fPIC" \
+       {pr26094-1a.c} \
+       {{readelf {--dyn-syms --wide} pr26094-1a.rd}} \
+       "pr26094-1.so" \
+    ] \
+    [list \
+       "Build pr26094-1" \
+       "-Wl,--no-as-needed tmpdir/pr26094-1.so" \
+       "-fcommon" \
+       {pr26094-1b.c pr26094-1c.c} \
+       {{readelf {--dyn-syms --wide} pr26094-1b.rd}} \
+       "pr26094-1" \
+    ] \
+]
+
 run_ld_link_tests [list \
     [list \
        "pr22269-1 (static pie undefined weak)" \