Bug 35029 - clang: wrong dynamic linker on aarch64
Summary: clang: wrong dynamic linker on aarch64
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: clang6.0 (show other bugs)
Version: unstable
Hardware: aarch64 Linux
: P3 normal
Assignee: Konstantin A Lepikhov (L.A. Kostis)
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-06-13 09:21 MSK by Vitaly Chikunov
Modified: 2018-06-14 09:39 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Chikunov 2018-06-13 09:21:39 MSK
При сборке 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;
Comment 1 Vitaly Chikunov 2018-06-14 08:01:35 MSK
Пока придумал сделать так:

%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
Comment 2 Gleb F-Malinovskiy 2018-06-14 08:44:34 MSK
Ты повесил багу когда она уже была исправлена но исправление ещё не добралось до Сизифа:

* 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.
Comment 3 Gleb F-Malinovskiy 2018-06-14 08:47:24 MSK
(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 передать не проще?
Comment 4 Vitaly Chikunov 2018-06-14 09:39:11 MSK
(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 все равно как-то не так собрался, но это уже другая история.)