Как-то однажды я собрал программу в своём 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.
Автор: Дмитрий