<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120192>120192</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Global symbols are not unique when using lld
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld,
BOLT
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
linsinan1995
</td>
</tr>
</table>
<pre>
It looks like LLD will drop the versioning suffix and leave global symbols with the same names in executables, which prevents BOLT from optimizing the binary. It is an expected output from LLD, and is there any option we could use to keep '@VER' strings?
Here is an example (simplified from [libnuma](https://github.com/numactl/numactl)):
test.c
```
#define SYMVER(a,b) __asm__ (".symver " a "," b);
static int nodemask_sz = 0;
SYMVER("numa_max_possible_node_v1", "numa_max_possible_node@libnuma_1.1")
int
numa_max_possible_node_v1(void)
{
return ((sizeof(unsigned long long)*8)-1);
}
SYMVER("numa_max_possible_node_v2", "numa_max_possible_node@@libnuma_1.2")
int
numa_max_possible_node_v2(void)
{
return nodemask_sz;
}
```
main.c
```
int
numa_max_possible_node(void);
int main() {
return numa_max_possible_node();
}
```
## 1. build with clang + ld
clang test.c main.c -Wl,-q -o a.ld.out
llvm-bolt a.ld.out -o a.opt
BOLT works fine, and the symbol table:
```
0000000000401110 l F .text 000000000000000b numa_max_possible_node@libnuma_1.1
0000000000401120 g F .text 000000000000000d numa_max_possible_node@@libnuma_1.2
0000000000401120 g F .text 000000000000000d numa_max_possible_node_v2
0000000000401110 g F .text 000000000000000b numa_max_possible_node_v1
```
## 2. build with clang + lld
clang test.c main.c -fuse-ld=lld -Wl,-q -o a.lld.out
llvm-bolt a.lld.out -o a.opt
BOLT throws an error: `BOLT-ERROR: bad input binary, global symbol "numa_max_possible_node" is not unique`, and the symbol table looks like
```
00000000002016a0 g F .text 000000000000000b numa_max_possible_node_v1
00000000002016b0 g F .text 000000000000000d numa_max_possible_node_v2
00000000002016a0 g F .text 000000000000000b numa_max_possible_node
00000000002016b0 g F .text 000000000000000d numa_max_possible_node
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVlFvqzgT_TXOyyjIHpICDzzQ5ub7rtTVlbqrXe1TZMAQb43NtU3S9tevDG1vki3ZXi1CxBD7zJmZ4xlz52SrhcjJ-pasNws--L2xuZLaSc01y7L1ojT1c_7VgzLm0YGSjwLu7zdwlEpBbU0Pfi_gIKyTRkvdghuaRj4B1zUowQ8CWmVKrsA9d6VRDo7S78c1jncCNO-EA6lBPIlq8LxUwhG8g-NeVnvorTgI7R3cfrv_DRprOjC9l518CZYCSCk1t88RfPUgHfCA04vKixrM4PvBT4vu7zcBNHCSLqyzArh-HsGMhqOAygyqhsEJ8AYeheiBYEJW9PcvDwQTcN5K3ToSbwktpvv_AeTNJu96JYBg6mTXK9lIUU-WyfpWyVIPHSfrDcF0733vSFwQ3BLcttLvhzKqTEdwGyZVXp2OsnDHxbtNL5yPqjC-oa83LQjGtWikFvDrn7-MfFNO8K4kmMFux1232wVmBDFyz91BWCCIwMOT4F0Yl6OZ28mG89zLCqT2oE0tOu4ed-4FSLwB-j7p3RJBDGx3HX_a9cY5WSqxC-t2BzYZgNkpZEVfY7Nj0TQ7I7SQ2hNaXEFND0bW01ySTIQyK_xg9eRn6uSLMA3BdNCjvmtQRrfjY4xpkRLMluyH18nm827hJ9w68ww_6Rle9ewkF2ekT4VAi45L_Q-BXDN7YvMttyHzAWcMQwYTEQCANyZzQJfxPKdGMCYYA4ugHKSqpzpQKa5bIHgLqia0mF4nlcPkCyz_UATvlt9haYBHqo7MENxR6tAtS6P8-8dpgun9ZG8sGUdjHx2EzfG2_8fKM5YiGKvN6_Y64UrfrxVljFFQsIXIiycPQM-vci4Y58q-xEQKbQjoO-4FbD0Pe6Gsn0c-u-al-EEY2ith-BQqmxUFzoliXhXN4MRS1STeKFVfiuRjlczLxO-tOU6l3FpjSVwAuaHhr-WXh4dvD-FDyWuQOrSUqecEQZ21tisVATF0Cm08DFp-H0Twf0aPJ312VpdI2Q3_l0z_RE7OgctrmZ5T5qVkPmT46d3zIaX_quoPxEeLRZ3HdRZnfCFylsSrFcuSFBf7PClZE_OsjBPWlJSltOHZCpNmzVlDG0wWMkeKK4YsoQm7QYzKVVpX6ypNm3XTNDeMrKjouFRR0GBkbLuQzg0iZ0hZhgvFS6HcePBCDDp_68ZBdeFlvVnYfNLv0Lpx3zvvfqB56ZXI_3d-uOJWnMgMjnuhYXDhsKRUvRisyq8cQAL068-yt-YvUXmC25G1I7h9JX7I8e8AAAD__0EyFew">