Недавно я пытался перенести существующее приложение C ++ в новую производственную среду (обновленное ядро, обновленный glibc и т. Д.). Несмотря на то, что вывод ldd показал, что все мои .so были найдены, включая интерпретатор ELF, выполнение всегда приводило к «Нет такого файла или каталога».
$ ldd my_app
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fd41afd6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd41ae52000)
libm.so.6 => /lib/libm.so.6 (0x00007fd41ad11000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fd41acf7000)
libc.so.6 => /lib/libc.so.6 (0x00007fd41ab3a000)
/lib64/ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x00007fd4258b5000) <= ELF Interpreter
libconfig.so.9 => /usr/lib/libconfig.so.9 (0x00007fd41ab2c000)
libsensors.so.4 => /usr/lib/libsensors.so.4 (0x00007fd41ab1b000)
$ file my_app
ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c8c7eeb2f6bdb96dab7b0cc9ad41aa6e3d610ec7, stripped
$ readelf -a my_app |grep "интерпретатор"
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Я не думал, что моя проблема имела какое-либо отношение к интерпретатору из-за этого вывода ldd. Поэтому я попробовал все другие возможные обходные пути, но безуспешно. После долгих поисков в Интернете я столкнулся с проблемой, связанной с тем, что в решении предлагалось создать символическую ссылку из жестко-закодированного пути приложения для интерпретатора к реальному пути. В моем случае:
ln -s /lib/ld-2.29.so /lib64/ld-linux-x86-64.so.2
Это наконец решило проблему. В конце концов, я был разочарован, так как я не искал настоящую проблему, и мне потребовалось слишком много времени, чтобы понять ее из-за вводящего в заблуждение вывода ldd.
Почему ldd говорит, что интерпретатор присутствует, хотяон не будет загружен при запуске двоичного файла? Моя интерпретация использования / вывода ldd ошибочна?