[binutils-gdb] elf: Always append ".COUNT" to local symbols
H.J. Lu
hjl@sourceware.org
Thu May 6 03:32:39 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4467df35a93e4c8e5ff7549e8d23324c64f527bd
commit 4467df35a93e4c8e5ff7549e8d23324c64f527bd
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed May 5 20:28:39 2021 -0700
elf: Always append ".COUNT" to local symbols
Always append ".COUNT" to local symbols to avoid potential conflicts
with existing local symbol "XXX.COUNT".
bfd/
PR ld/27825
* elflink.c (elf_link_output_symstrtab): Always append ".COUNT"
to local symbols.
ld/
PR ld/27825
* testsuite/ld-elf/pr27825-1.d: New file.
* testsuite/ld-elf/pr27825-1a.s: Likewise.
* testsuite/ld-elf/pr27825-1b.s: Likewise.
* testsuite/ld-elf/pr27825-2.d: Likewise.
* testsuite/ld-elf/pr27825-2a.s: Likewise.
* testsuite/ld-elf/pr27825-2b.s: Likewise.
Diff:
---
bfd/ChangeLog | 6 ++++++
bfd/elflink.c | 39 +++++++++++++++++++--------------------
ld/ChangeLog | 10 ++++++++++
ld/testsuite/ld-elf/pr26391.nd | 2 +-
ld/testsuite/ld-elf/pr27825-1.d | 21 +++++++++++++++++++++
ld/testsuite/ld-elf/pr27825-1a.s | 7 +++++++
ld/testsuite/ld-elf/pr27825-1b.s | 5 +++++
ld/testsuite/ld-elf/pr27825-2.d | 18 ++++++++++++++++++
ld/testsuite/ld-elf/pr27825-2a.s | 5 +++++
ld/testsuite/ld-elf/pr27825-2b.s | 3 +++
ld/testsuite/ld-elf/pr27825-2c.s | 4 ++++
11 files changed, 99 insertions(+), 21 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c574570fbe9..e481c1b0a25 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2021-05-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/27825
+ * elflink.c (elf_link_output_symstrtab): Always append ".COUNT"
+ to local symbols.
+
2021-05-05 Alan Modra <amodra@gmail.com>
* vms-lib.c (vms_traverse_index): Account for vms_kbn size when
diff --git a/bfd/elflink.c b/bfd/elflink.c
index cb38a025349..0e1871aaac9 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -9830,6 +9830,9 @@ elf_link_output_symstrtab (void *finf,
&& ELF_ST_BIND (elfsym->st_info) == STB_LOCAL)
{
struct local_hash_entry *lh;
+ size_t count_len;
+ size_t base_len;
+ char buf[30];
switch (ELF_ST_TYPE (elfsym->st_info))
{
case STT_FILE:
@@ -9840,28 +9843,24 @@ elf_link_output_symstrtab (void *finf,
(&flinfo->local_hash_table, name, true, false);
if (lh == NULL)
return 0;
- if (lh->count)
+ /* Always append ".COUNT" to local symbols to avoid
+ potential conflicts with local symbol "XXX.COUNT". */
+ sprintf (buf, "%lx", lh->count);
+ base_len = lh->size;
+ if (!base_len)
{
- /* Append ".COUNT" to duplicated local symbols. */
- size_t count_len;
- size_t base_len = lh->size;
- char buf[30];
- sprintf (buf, "%lx", lh->count);
- if (!base_len)
- {
- base_len = strlen (name);
- lh->size = base_len;
- }
- count_len = strlen (buf);
- versioned_name = bfd_alloc (flinfo->output_bfd,
- base_len + count_len + 2);
- if (versioned_name == NULL)
- return 0;
- memcpy (versioned_name, name, base_len);
- versioned_name[base_len] = '.';
- memcpy (versioned_name + base_len + 1, buf,
- count_len + 1);
+ base_len = strlen (name);
+ lh->size = base_len;
}
+ count_len = strlen (buf);
+ versioned_name = bfd_alloc (flinfo->output_bfd,
+ base_len + count_len + 2);
+ if (versioned_name == NULL)
+ return 0;
+ memcpy (versioned_name, name, base_len);
+ versioned_name[base_len] = '.';
+ memcpy (versioned_name + base_len + 1, buf,
+ count_len + 1);
lh->count++;
break;
}
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 52629384aba..0c7c759b427 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2021-05-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/27825
+ * testsuite/ld-elf/pr27825-1.d: New file.
+ * testsuite/ld-elf/pr27825-1a.s: Likewise.
+ * testsuite/ld-elf/pr27825-1b.s: Likewise.
+ * testsuite/ld-elf/pr27825-2.d: Likewise.
+ * testsuite/ld-elf/pr27825-2a.s: Likewise.
+ * testsuite/ld-elf/pr27825-2b.s: Likewise.
+
2021-05-05 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/empty.s: New file.
diff --git a/ld/testsuite/ld-elf/pr26391.nd b/ld/testsuite/ld-elf/pr26391.nd
index d01f3381340..07bfd7fb5b5 100644
--- a/ld/testsuite/ld-elf/pr26391.nd
+++ b/ld/testsuite/ld-elf/pr26391.nd
@@ -1,5 +1,5 @@
#...
-[0-9a-z]+ [td] _?bar
+[0-9a-z]+ [td] _?bar.0
#...
[0-9a-z]+ [td] _?bar.1
#...
diff --git a/ld/testsuite/ld-elf/pr27825-1.d b/ld/testsuite/ld-elf/pr27825-1.d
new file mode 100644
index 00000000000..c9b1b921f3d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-1.d
@@ -0,0 +1,21 @@
+#source: pr27825-1a.s
+#source: pr27825-1b.s
+#ld: -e _start --emit-relocs -z unique-symbol
+#nm: --defined-only
+#xfail: [is_generic]
+#xfail: fr30-*-* frv-*-* ft32-*-* iq2000-*-* mn10200-*-* msp*-* mt-*-*
+# These targets don't support -z.
+
+#...
+[0-9a-f]+ t bar.0
+#...
+[0-9a-f]+ t bar.1
+#...
+[0-9a-f]+ t bar.1.0
+#...
+[0-9a-f]+ t bar.1.1
+#...
+[0-9a-f]+ t bar.2.0
+#...
+[0-9a-f]+ t bar.2.1
+#pass
diff --git a/ld/testsuite/ld-elf/pr27825-1a.s b/ld/testsuite/ld-elf/pr27825-1a.s
new file mode 100644
index 00000000000..e6940e17430
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-1a.s
@@ -0,0 +1,7 @@
+ .text
+ .globl _start
+_start:
+bar:
+bar.1:
+bar.2:
+ .nop
diff --git a/ld/testsuite/ld-elf/pr27825-1b.s b/ld/testsuite/ld-elf/pr27825-1b.s
new file mode 100644
index 00000000000..2128e802d4b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-1b.s
@@ -0,0 +1,5 @@
+ .text
+bar:
+bar.1:
+bar.2:
+ .nop
diff --git a/ld/testsuite/ld-elf/pr27825-2.d b/ld/testsuite/ld-elf/pr27825-2.d
new file mode 100644
index 00000000000..12a18636367
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-2.d
@@ -0,0 +1,18 @@
+#source: pr27825-2a.s
+#source: pr27825-2b.s
+#source: pr27825-2c.s
+#ld: -e _start --emit-relocs -z unique-symbol
+#nm: --defined-only
+#xfail: [is_generic]
+#xfail: fr30-*-* frv-*-* ft32-*-* iq2000-*-* mn10200-*-* msp*-* mt-*-*
+# These targets don't support -z.
+
+#...
+[0-9a-f]+ t bar.0
+#...
+[0-9a-f]+ t bar.1
+#...
+[0-9a-f]+ t bar.1.0
+#...
+[0-9a-f]+ t bar.2.0
+#pass
diff --git a/ld/testsuite/ld-elf/pr27825-2a.s b/ld/testsuite/ld-elf/pr27825-2a.s
new file mode 100644
index 00000000000..40fc05bc537
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-2a.s
@@ -0,0 +1,5 @@
+ .text
+ .globl _start
+_start:
+bar:
+ .nop
diff --git a/ld/testsuite/ld-elf/pr27825-2b.s b/ld/testsuite/ld-elf/pr27825-2b.s
new file mode 100644
index 00000000000..9e6f96a8bc7
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-2b.s
@@ -0,0 +1,3 @@
+ .text
+bar:
+ .nop
diff --git a/ld/testsuite/ld-elf/pr27825-2c.s b/ld/testsuite/ld-elf/pr27825-2c.s
new file mode 100644
index 00000000000..762f8864e5d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr27825-2c.s
@@ -0,0 +1,4 @@
+ .text
+bar.1:
+bar.2:
+ .nop
More information about the Binutils-cvs
mailing list