<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86047>86047</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLD `--just-symbols` behavior differs from BFD and Gold
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Prabhuk
</td>
</tr>
</table>
<pre>
This bug summarizes a difference in behavior in LLD compared to BFD and Gold linkers when `--just-symbols` is involved.
## Experiment
**Consider `[main.cc](main.cc)` which we compile into `main\_foo\_bar\_baz.o`.**
$ clang -c main.cc -o main\_foo\_bar\_baz.o
```
extern "C" int foo();
extern "C" int baz();
extern "C" int bar();
int try_link() {
return baz() + foo() + bar();
}
```
**Consider `foo_and_bar.S`,**
<table>
<tr>
<td>foo_and_bar.S
</td>
<td>Create “foo_bar_from_assembly.o”
</td>
</tr>
<tr>
<td style="background-color: #333333"><code>.text \
.globl bar \
.type bar,@function \
bar: \
movl $45, %eax \
retq \
\
.globl foo \
.type foo,@function \
foo: \
movl $65, %eax \
retq</code>
</td>
<td style="background-color: #333333"><code>$ clang -c foo_and_bar.S -o foo_bar_from_assembly.o \
\
$ llvm-nm foo_bar_from_assembly.o \
\
0000000000000000 T bar \
0000000000000006 T foo</code>
</td>
</tr>
</table>
**Consider `foo_and_baz.S`,**
<table>
<tr>
<td>foo_and_baz.S
</td>
<td>Create “foo_baz_linked_bin_elf”
</td>
</tr>
<tr>
<td style="background-color: #333333"><code>.text \
.globl baz \
.type baz,@function \
bar: \
movl $55, %eax \
retq \
\
.globl foo \
.type foo,@function \
foo: \
movl $65, %eax \
retq</code>
</td>
<td style="background-color: #333333"><code>$ clang -c foo_and_baz.S -o foo_baz_from_assembly.o \
\
$ llvm-nm foo_baz_from_assembly.o \
\
0000000000000000 T baz \
0000000000000006 T foo \
\
$ ld.lld foo_baz_from_assembly.o -o foo_baz_linked_bin_elf \
\
$ llvm-nm foo_baz_linked_bin_elf \
0000000000201120 T baz \
0000000000201126 T foo</code>
</td>
</tr>
</table>
## BFD linker
```
$ ld.bfd --just-symbols foo_baz_linked_bin_elf -o bin_foo_bar_baz_bfd foo_bar_from_assembly.o main_foo_bar_baz.o
ld.bfd: warning: foo_bar_from_assembly.o: missing .note.GNU-stack section implies executable stack
ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ld.bfd: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ llvm-nm bin_foo_bar_baz_bfd
0000000000401010 T _Z8try_linkv
0000000000403000 R __bss_start
0000000000403000 R _edata
0000000000403000 R _end
U _start
0000000000401000 T bar
0000000000201120 A baz
0000000000201126 A foo
```
## Gold linker
```
$ ld.gold --just-symbols foo_baz_linked_bin_elf -o bin_foo_bar_baz_gold foo_bar_from_assembly.o main_foo_bar_baz.o
$ llvm-nm bin_foo_bar_baz_gold
00000000004000c0 T _Z8try_linkv
0000000000000000 A __bss_start
0000000000000000 A _edata
0000000000000000 A _end
00000000004000b0 T bar
0000000000201120 A baz
0000000000201126 A foo
```
## LLD linker
LLD throws a duplicate symbol failure.
```
$ ld.lld --just-symbols foo_baz_linked_bin_elf -o bin_foo_bar_baz_lld foo_bar_from_assembly.o main_foo_bar_baz.o
ld.lld: error: duplicate symbol: foo
>>> defined in foo_baz_linked_bin_elf
>>> defined in foo_bar_from_assembly.o
```
**Question: Is this difference in behavior expected with LLD or is this a bug?**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEtv4zgM_jXKhYihyM7rkEObNIMFBrOvzmUvgWzTiaaylJXktM2vX9BO2jycptPBLPawhuGHxJdIfjRl6b1aGsQJ69-y_qwjq7CybvKbk-mqeuikNn-eMD5j_Ka53q-Uh7Ragq_KUjq1RQ8SclUU6NBkCMpAiiu5UdbR8-fPM8hsuZYOcwgWbuczkCaHT1bnoJV5QOfhcYUG2IB3u98qH7r-uUyt9mzAQXlQZmP1BvPo0IzdVcRMxHD3tEanSjTheJLOqTVe5ehIPOvfllKZKMtYf8bEaP8ixqTqcaWyFTxiba7StJJgiY3IWH-6KKylWypdc9tGlg141Og51pxApqVZQjeDnRLoWnhL0PnaBnx31q_4FNAZYEJMmRBkG5AYMSLr49uLRKncvofInRA1V5oL7nlBcWoIgA13FAAOQ-XMqwZg4vbVqPrtUDDsJA9nrQt8O3SFtQtpcvJZ9CfxkPFnfm-u8TTIVCOL7_aW0pA7eK8HchbfHYs9mGViXhOccUwdyoDA7gQbcTaekoRUukXhbLmQ3mOZ6ufI7udnbwndDbmrloIPz7SgGRMildnD0tnK5N3MautYfANMxM3BhCDmeJrZnBwQBXwKwPrTF3n1ES21TTVQeFomw_MaAZrYTVnCi8pkQVnzSkpTpPaUtbQbTXcmkqTPxBSY6KN8Oid0GP4-GH152htWWHvZsDrF2g2jqSuGDa4a1oRl58HrSfHh4ByViaNMpGJxIbHavEaCtN6UXVN-Dxs_OeD-OCFOpgdwX7v-vd45y-7dwBE234v67c9B_faHUL-tCyPmi1SZBeriBfTwH0f99i3Ub38A9f3_Uf9B1G8PUb_9GOrfxdaK-u011F80II-0zi_qP1jRMVTeu6ATrjYzBe_1xBvLqOd_fvE6bEipyW1626t93c6JaZHDcfd7yQVdC_S4r_NEQcyX6j71nIfE-1az0UmZ-iidUWZJj5eamfgGSuW9MkuIjA0YffryteuDzB7AYwNGVa61Qg_4hFlVuwlqglNtX369v6N7s49oNgqVoz4_x7XDTAbM6w3Co9IaUgSHpd1gTnsJCUUVKoewQedJqS0grPDI1a3ryqQxNkChTA5ognuGxsmw8EG6QM1pjoWsdKAlBguv2ZPwHuf8tLvfp2lLJE7TjwT0KD0Xf432vfTmnCgmKP4Bi0Xq_c6qizSYyyDfmDb5cXl7Ob7CJdG9l-__BXjd1F-GdmjViXO9qT9EyMH2770QWRLLhzFSc38vSK4HnMSee5Pz7FrEd8X35q2Iv9K0Rvxg2rQakf6rIaWd_nlEaTSsnH2sfxNUa60I4nv8FVLpymHb1r41B_SPpID-QAY0OqmGoHPNl_10EbvCuf9M3DUnFRRlmrp1oVu8xnBeh6_Go26Of6_QU00mw37xEKjSXvhBg09rzKjiPqqwqiNo61pc80hIqyWL54ctdyefxPk4HssOTnrDHh-P-HAw7qwmoyIeJb08x2GSjIrxkMe5GKbpOBUJxnLU66iJ4CLhsehxLgZ8HA3ifq_PuSwSzkWcZSzhWEqlI8JaZN2yo7yvcDIa8GTY0TJF7eu_VEJQSIRg_VnHTWpkptXSs4Rr5YN_5Q8qaJzQqlr_Lb14oXGOB3L30Q-qTuX0ZBXC2rP4hok5E_OlCqsqjTJbMjEnTbtbd-3sN8wCE_PabM_EvLb8nwAAAP__2htqWQ">