Архив метки: patchelf

linux: почему же ELF interpreter в Arch Linux 64 линкуется в /lib

Как-то однажды я собрал программу в своём 64-битном Arch Linux и отдал бинарник, а оно берёт и не работает. Пишет:

/lib/ld-linux-x86-64.so.2: bad ELF interpreter: Нет такого файла или каталога

Ну, долго тут думать не пришлось — оказался странным путь для ld-linux-x86-64. Я не понял как оно должно быть по LSB, но во всех тестируемых системах ld-linux-x86-64.so.2 ищется в /lib64.
Fedora 17:

$ whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib64/ld-linux-x86-64.so.2 /usr/lib64/ld-linux-x86-64.so.2

Arch Linux:

$  whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2

В генту lib это ссылка на lib64.
Причём, в арче в lib64 кроме двух ссылок на соответствующие файлы в lib больше ничего нет:

$ ls /lib64
ld-2.15.so  ld-linux-x86-64.so.2


Короче, как ясно, интерпретатор находится и в lib и в lib64. То есть будет работать и так и так. Но при линковке на моей машине у меня связывается напрямую в lib, так что нигде больше не работает:

$ ldd ./myprogram
...
 /lib/ld-linux-x86-64.so.2 (0x00007f4b4ea70000)
...

Это печально, ну а что делать. Решил проблему временно с помощью patchelf:

patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 ./myprogram

Всё стало прекрасно. На этот счёт девелопер (?) сказал:

Historically, we were a pure 64-bit distro (multilib is a more recent thing), so the distinction of /lib v. /lib64 didn’t make sense for us.

Автор: Дмитрий