| Summary: | clang: wrong dynamic linker on aarch64 | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Vitaly Chikunov <vt> |
| Component: | clang6.0 | Assignee: | Konstantin A Lepikhov (L.A. Kostis) <lakostis> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P3 | CC: | glebfm, lav |
| Version: | unstable | ||
| Hardware: | aarch64 | ||
| OS: | Linux | ||
Пока придумал сделать так: %ifarch aarch64 objcopy --dump-section .interp=/tmp/interp /bin/ls /dev/null objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bps %if_with luajit objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bcc-lua %endif %endif Ты повесил багу когда она уже была исправлена но исправление ещё не добралось до Сизифа: * Tue Jun 12 2018 Gleb F-Malinovskiy <glebfm@altlinux.org> 6.0.0-alt0.8.rel - lld: backported upstream patch implementing --{push,pop}-state support. - clang: changed default dynamic linker path for aarch64 architecture. - aarch64: temporarily rebuilt with gcc to fix build from source. - clang-alt-triple.patch: added mipsel and mips64el triplets. (In reply to comment #1) > Пока придумал сделать так: > > %ifarch aarch64 > objcopy --dump-section .interp=/tmp/interp /bin/ls /dev/null > objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bps > %if_with luajit > objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bcc-lua > %endif > %endif А Wl,-dynamic-linker передать не проще? (In reply to comment #3) > (In reply to comment #1) > > Пока придумал сделать так: > > > > %ifarch aarch64 > > objcopy --dump-section .interp=/tmp/interp /bin/ls /dev/null > > objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bps > > %if_with luajit > > objcopy --update-section .interp=/tmp/interp %buildroot/usr/bin/bcc-lua > > %endif > > %endif > > А Wl,-dynamic-linker передать не проще? export LDFLAGS="-fuse-ld=lld -Wl,-dynamic-linker /lib64/ld-linux-aarch64.so.1" Так тоже сработало. (Не с первого раза, конечно, так как lld не поддерживает `=` в этой опции). (FYI: Правда, bcc все равно как-то не так собрался, но это уже другая история.) Также в glibc-ore добавлен симлинк /lib/ld-linux-aarch64.so.1 https://bugzilla.altlinux.org/37641 |
При сборке bcc под aarch64 вылезло: builder@localhost:~/RPM/BUILD/bcc-v0.5.0/BUILD/introspection$ clang -pipe -Wall -g -O2 -Wall -O2 -g -DNDEBUG -rdynamic CMakeFiles/bps.dir/bps.c.o -o bps ../src/cc/libbpf.a builder@localhost:~/RPM/BUILD/bcc-v0.5.0/BUILD/introspection$ ./bps -bash: ./bps: No such file or directory builder@localhost:~/RPM/BUILD/bcc-v0.5.0/BUILD/introspection$ readelf -l bps|grep interpreter [Requesting program interpreter: /lib/ld-linux-aarch64.so.1] builder@localhost:~/RPM/BUILD/bcc-v0.5.0/BUILD/introspection$ ls -l /lib/ld-linux-aarch64.so.1 ls: cannot access '/lib/ld-linux-aarch64.so.1': No such file or directory На сервере arena линкер находится в /lib64/ld-linux-aarch64.so.1. Или не там находится линкер на альте, или не туда его линкует clang. Инвестигация показала, что значения hardcoded в clang: llvm-project/clang/lib/Driver/ToolChains/Linux.cpp: std::string Linux::getDynamicLinker(const ArgList &Args) const { ... case llvm::Triple::aarch64: LibDir = "lib"; Loader = "ld-linux-aarch64.so.1"; break;