[llvm-bugs] [Bug 38074] New: Error static linking when clang++/lld 6.0.0 using Arch Linux
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu Jul 5 13:23:26 PDT 2018
https://bugs.llvm.org/show_bug.cgi?id=38074
Bug ID: 38074
Summary: Error static linking when clang++/lld 6.0.0 using Arch
Linux
Product: lld
Version: unspecified
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: ELF
Assignee: unassignedbugs at nondot.org
Reporter: wink at saville.com
CC: llvm-bugs at lists.llvm.org
See [1] for a conversation on cfe-dev.
My executive summary at [2] is: In _dl_get_origin lld is linking a call to
mempcpy which I'd call "thunking code" as it returns in rax the address of the
code that should be called instead of the address of the next available address
of the destination buffer. And specifically, since rax is pointing at code,
when a zero is stored to try to terminate the string we seg fault.
The following (github [3]) code:
$ cat main.cpp
#include <iostream>
int main(int argc, char *argv[]) {
for (int i=0; i < argc; i++) {
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
}
Compiles successfully:
$ clang++ -fuse-ld=lld -o main-lld -static -pthread main.cpp
-Wl,--reproduce=main-lld-repro.tar
$
But the resulting binary seg faults when run:
$ ./main-lld 1 2 3
Segmentation fault (core dumped)
If I compile using gold and then run, all is well:
$ clang++ -fuse-ld=gold -o main-gold -static -pthread main.cpp
$ ./main-gold 4 5
argv[0]: ./main-gold
argv[1]: 4
argv[2]: 5
Rui and Peter are unable to reproduce this on their older systems, so I've
prepared a docker image [4] which can be used to test.
For example:
wink at wink-desktop:~/
$ mkdir xx && cd xx
wink at wink-desktop:~/xx
$ docker run --name lld-bug -v `pwd`:`pwd` -w `pwd` --rm -it
winksaville/lld-static-link-bug:arch
Cloning into 'lld-bug'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 11 (delta 2), reused 11 (delta 2), pack-reused 0
Unpacking objects: 100% (11/11), done.
clang++ -fuse-ld=gold -g -o main-gold -v -static -pthread main.cpp
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/sbin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation:
/usr/sbin/../lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation:
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Selected GCC installation: /usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
"/usr/bin/clang-6.0" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all
-disable-free -disable-llvm-verifier -discard-value-names -main-file-name
main.cpp -static-define -mrelocation-model pic -pic-level 2 -pic-is-pie
-mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64
-dwarf-column-info -debug-info-kind=limited -dwarf-version=4
-debugger-tuning=gdb -v -resource-dir /usr/lib/clang/6.0.0 -internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1
-internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/x86_64-pc-linux-gnu
-internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/backward
-internal-isystem /usr/local/include -internal-isystem
/usr/lib/clang/6.0.0/include -internal-externc-isystem /include
-internal-externc-isystem /usr/include -fdeprecated-macro
-fdebug-compilation-dir /home/wink/xx/lld-bug -ferror-limit 19 -fmessage-length
186 -pthread -stack-protector 2 -fobjc-runtime=gcc -fcxx-exceptions
-fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o
/tmp/main-395c1b.o -x c++ main.cpp
clang -cc1 version 6.0.0 based upon LLVM 6.0.0 default target
x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/x86_64-pc-linux-gnu
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/backward
/usr/local/include
/usr/lib/clang/6.0.0/include
/usr/include
End of search list.
"/usr/sbin/ld.gold" -m elf_x86_64 -static -o main-gold
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crt1.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crti.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtbeginT.o
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64
-L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../.. -L/usr/bin/../lib
-L/lib -L/usr/lib /tmp/main-395c1b.o -lstdc++ -lm --start-group -lgcc -lgcc_eh
-lpthread -lc --end-group
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtend.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crtn.o
./main-gold 4 5 6
argv[0]: ./main-gold
argv[1]: 4
argv[2]: 5
argv[3]: 6
clang++ -fuse-ld=lld -g -o main-lld -v -static -pthread main.cpp
-Wl,--reproduce=main-lld-repro
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/sbin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation:
/usr/sbin/../lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation:
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Selected GCC installation: /usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
"/usr/bin/clang-6.0" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all
-disable-free -disable-llvm-verifier -discard-value-names -main-file-name
main.cpp -static-define -mrelocation-model pic -pic-level 2 -pic-is-pie
-mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64
-dwarf-column-info -debug-info-kind=limited -dwarf-version=4
-debugger-tuning=gdb -v -resource-dir /usr/lib/clang/6.0.0 -internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1
-internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/x86_64-pc-linux-gnu
-internal-isystem
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/backward
-internal-isystem /usr/local/include -internal-isystem
/usr/lib/clang/6.0.0/include -internal-externc-isystem /include
-internal-externc-isystem /usr/include -fdeprecated-macro
-fdebug-compilation-dir /home/wink/xx/lld-bug -ferror-limit 19 -fmessage-length
186 -pthread -stack-protector 2 -fobjc-runtime=gcc -fcxx-exceptions
-fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o
/tmp/main-96773c.o -x c++ main.cpp
clang -cc1 version 6.0.0 based upon LLVM 6.0.0 default target
x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/x86_64-pc-linux-gnu
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/backward
/usr/local/include
/usr/lib/clang/6.0.0/include
/usr/include
End of search list.
"/usr/sbin/ld.lld" -m elf_x86_64 -static -o main-lld
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crt1.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crti.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtbeginT.o
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64
-L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64
-L/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../.. -L/usr/bin/../lib
-L/lib -L/usr/lib /tmp/main-96773c.o --reproduce=main-lld-repro -lstdc++ -lm
--start-group -lgcc -lgcc_eh -lpthread -lc --end-group
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtend.o
/usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crtn.o
./main-lld 1 2 3
make: *** [Makefile:3: run-lld] Segmentation fault (core dumped)
And below I run the docker image interactively and use gdb:
wink at wink-desktop:~/xx
$ docker run --privileged --name lld-bug -v `pwd`:`pwd` -w `pwd` --rm -it
--entrypoint='/usr/bin/bash' winksaville/lld-static-link-bug:arch
[root at db1cc49aeeeb xx]# cd lld-bug/
[root at db1cc49aeeeb lld-bug]# gdb -q --args ./main-lld 1 2 3
Reading symbols from ./main-lld...done.
(gdb) r
Starting program: /home/wink/xx/lld-bug/main-lld 1 2 3
Program received signal SIGSEGV, Segmentation fault.
0x0000000000384256 in _dl_get_origin ()
(gdb) bt
#0 0x0000000000384256 in _dl_get_origin ()
#1 0x00000000003838bf in _dl_non_dynamic_init ()
#2 0x00000000002ef141 in __libc_init_first ()
#3 0x00000000002eee37 in __libc_start_main ()
#4 0x000000000025302a in _start ()
(gdb) i r
rax 0x364ca0 3558560
rbx 0x7fffffffdb70 140737488345968
rcx 0x3ae460 3859552
rdx 0x364c60 3558496
rsi 0x7fffffffdb70 140737488345968
rdi 0x3ae460 3859552
rbp 0x16 0x16
rsp 0x7fffffffdb70 0x7fffffffdb70
r8 0x3 3
r9 0x0 0
r10 0xfffffffffffff000 -4096
r11 0x0 0
r12 0x3ae460 3859552
r13 0x0 0
r14 0x3994f8 3773688
r15 0x0 0
rip 0x384256 0x384256 <_dl_get_origin+342>
eflags 0x10202 [ IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
(gdb) disassemble $rax
Dump of assembler code for function __mempcpy_avx_unaligned_erms:
0x0000000000364ca0 <+0>: mov %rdi,%rax
0x0000000000364ca3 <+3>: add %rdx,%rax
0x0000000000364ca6 <+6>: jmp 0x364cb3
<__memmove_avx_unaligned_erms+3>
End of assembler dump.
(gdb)
[1]:
http://clang-developers.42468.n3.nabble.com/Static-linking-a-program-td4061003.html
[2]:
http://clang-developers.42468.n3.nabble.com/Static-linking-a-program-tc4061003.html#a4061103
[3]: https://github.com/winksaville/explore-cpp-lld-static-link-bug
[4]: https://github.com/winksaville/Dockerfile-lld-static-link-bug
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20180705/42584172/attachment.html>
More information about the llvm-bugs
mailing list