[lld] Linker cannot handle sections with non-unique names

Hi,

FYI

LLD cannot handle ELF sections with non-unique names. An object file
with such sections can be generated by the Clang since r234143. I am
not sure that Clang works absolutely correct but bfd linker works
fine.

Right now I do not have a time to investigate this problem. If nobody
take, I will try to solve it later.

Here is the reproduction script for x86_64 host:

$ cat test.cc
template <class T>
void foo(T) {}

int main() {
  foo(0);
  foo(1.0);
}

$ clang++ -c test.cc -fno-unique-section-names
$ lld -flavor gnu -target x86_64 --hash-style=both --build-id \
  --eh-frame-hdr -m elf_x86_64 \
  -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out \
  <bunch of regular linker arguments here>
$ ./a.out
Illegal instruction

$ clang++ -c test.cc -funique-section-names
$ lld -flavor gnu -target x86_64 --hash-style=both --build-id \
  --eh-frame-hdr -m elf_x86_64 \
  -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out \
  <bunch of regular linker arguments here>
$ ./a.out

Thanks Simon fir the test. I may be able to get to this issue later too. The bug is mostly in the elf reader where it's skipping real sections with the same name.

Attached patch fixes the issue.

no-unique-sections.patch (2.81 KB)

This seems OK to me but please add a testcase.

Thanks for the quick fix. The patch LGTM if you add a test case.
Unfortunately yaml2obj does not support duplicated section names but
we can use a binary input file.

I plan to add a test case but couldn't add because of yaml2obj support. I am adding that support to yaml2obj and obj2yaml and push this patch later. I don't like the idea of adding binary files to the test repo as we need to keep cleaning up later.

IMHO checking in a binary would actually be better.

Binaries are the input to the linker. What is desired in here is to
test that lld can work with a binary produced by a current clang. That
should still be the case in 1 year, even if what clang is producing is
different. Using yaml2obj just makes that connection more tenuous.

Cheers,
Rafael

I plan to add a test case but couldn't add because of yaml2obj support. I
am adding that support to yaml2obj and obj2yaml and push this patch later.
I don't like the idea of adding binary files to the test repo as we need to
keep cleaning up later.

Please make sure to pre-commit review this. I expect a bikeshed over the
syntax.

-- Sean Silva

Nothing wrong with going ahead with a temporary measure if the temporary measure is reasonable (besides the discussion if checking in binary files is desirable). Even if you plan to add a test written in YAML, it’s better to check in a binary at least for now than checking it in without any tests.

I have committed the patch with added test case at r238115.
It is better to do not keep a window broken for so long time.

Thanks Simon.