Статическая ссылка C++, затем -bash: ../bin/executable: нет такого файла или каталога

У меня есть это приложение, которое без проблем компилируется при динамической компоновке. Когда я перехожу к статической ссылке, я пытаюсь:

G++ -std=c++11 -static -o ../bin/executable executable.o obj1.o obj2.o obj3.o obj4.o ../lib/gzstream/libgzstream.a -lgsl -Wl,-Bstatic -lcurl -Wl,-Bdynamic -Wl,-Bsymbolic-functions -lnghttp2 -lidn2 -lrtmp -lssh -lpsl -lnettle -lgnutls -L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,-Bsymbolic- функции -Wl,-z,relro -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -llber -lldap -llber -lbrotlidec -lz -lgslcblas -llzma -lbz2 -lz -lpthread

Затем я вызываю исполняемый файл:

../bin/executable

Затем я получаю:

 -bash: ../bin/executable: No such file or directory

Но он существует, ls это подтверждает:

-rwxr-xr-x 1 username guest ? 7108400 Feb 12 23:07 ../bin/executable

. ldd также работает:

ldd ../bin/executable
linux-vdso.so.1 (0x00007ffd432c7000)
libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f0dcc5a4000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f0dcc583000)
librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x00007f0dcc563000)
libssh.so.4 => /lib/x86_64-linux-gnu/libssh.so.4 (0x00007f0dcc4f5000)
libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x00007f0dcc4e2000)
libnettle.so.7 => /lib/x86_64-linux-gnu/libnettle.so.7 (0x00007f0dcc4a8000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f0dcc2d0000)
libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f0dcc283000)
liblber-2.4.so.2 => /lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f0dcc272000)
libldap_r-2.4.so.2 => /lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f0dcc21c000)
libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f0dcc20e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0dcc1f2000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f0dcc1c7000)
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f0dcc1b4000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0dcc191000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0dcbfaf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0dcbe60000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0dcbc6e000)
libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f0dcbaea000)
libhogweed.so.5 => /lib/x86_64-linux-gnu/libhogweed.so.5 (0x00007f0dcbab3000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f0dcba2f000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f0dcb758000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f0dcc5eb000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f0dcb622000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f0dcb60c000)
libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f0dcb52d000)
libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f0dcb4fc000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f0dcb4f5000)
libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f0dcb4e6000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f0dcb4ca000)
libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f0dcb4ad000)
libgssapi.so.3 => /lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007f0dcb466000)
libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f0dcb443000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0dcb428000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0dcb422000)
libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007f0dcb416000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f0dcb40d000)
libheimntlm.so.0 => /lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007f0dcb401000)
libkrb5.so.26 => /lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007f0dcb36e000)
libasn1.so.8 => /lib/x86_64-linux-gnu/libasn1.so.8 (0x00007f0dcb2c8000)
libhcrypto.so.4 => /lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007f0dcb290000)
libroken.so.18 => /lib/x86_64-linux-gnu/libroken.so.18 (0x00007f0dcb275000)
libwind.so.0 => /lib/x86_64-linux-gnu/libwind.so.0 (0x00007f0dcb24b000)
libheimbase.so.1 => /lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007f0dcb239000)
libhx509.so.5 => /lib/x86_64-linux-gnu/libhx509.so.5 (0x00007f0dcb1eb000)
libsqlite3.so.0 => /lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f0dcb0c2000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f0dcb087000)

Кроме того, strace с -ff, похоже, выводит правильное сообщение из исполняемого файла:

strace -ff /lib64/ld-linux-x86-64.so.2  ../bin/executable

Это вывод readelf:

readelf -h ../bin/executable
ELF Header:
Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF64
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              EXEC (Executable file)
Machine:                           Advanced Micro Devices X86-64
Version:                           0x1
Entry point address:               0x424c40
Start of program headers:          64 (bytes into file)
Start of section headers:          7105840 (bytes into file)
Flags:                             0x0
Size of this header:               64 (bytes)
Size of program headers:           56 (bytes)
Number of program headers:         12
Size of section headers:           64 (bytes)
Number of section headers:         40
Section header string table index: 39

Как вы получили эту ошибку bash? g++ не должен вызывать bash.

Quimby 12.02.2023 23:35

Мои извинения, я забыл написать, что это происходит, когда я вызываю исполняемый файл, спасибо, что указали на это.

madreblu 12.02.2023 23:41

Пожалуйста, добавьте вывод ls -lZ ..bin/executable

stark 12.02.2023 23:48

А ты умеешь readelf -h ../bin/executable? эта ошибка появляется, если файл является исполняемым, но не может быть выполнен из-за, например. разная архитектура.

Quimby 12.02.2023 23:48

@madreblu Мне кажется, все в порядке, это то же самое, если вы делаете динамический? актуально, может попробовать запустить file ../bin/executable, видимо загрузчик просто чем-то не доволен.

Quimby 13.02.2023 15:31
strace -ff /lib64/ld-linux-x86-64.so.2 почему лд? Вы пробовали strace без ld только с бинарником? No-such-file-on-exec — это обычно какая-то проблема с загрузчиком.
teapot418 13.02.2023 15:44

@Quimby для динамики, он работает нормально, и я получаю: «Общий объект ELF 64-bit LSB, x86-64, версия 1 (SYSV), динамически связанный, интерпретатор /lib64/ld-linux-x86-64.so.2 , BuildID[sha1]=19c43ebc1d38726bc84f89bc1ca76a4457ae9c1f, для GNU/Linux 3.2.0, с debug_info, без удаления"

madreblu 14.02.2023 14:08

@teapot418 да, и я получаю: "execve("../bin/executable", ["../bin/executable"], 0x7ffe0cfa36a0 /* 22 vars */) = -1 ENOENT (Нет такого файла или каталога) strace : exec: Нет такого файла или каталога +++ завершился с 1 +++ ", что странно, потому что с -ff я получаю, по крайней мере, меню справки.

madreblu 14.02.2023 14:09

@madreblu Выглядит тоже хорошо, к сожалению, я не знаю, как помочь вам больше, не имея возможности проверить это на моей машине, извините.

Quimby 14.02.2023 14:27
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
9
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Статическая компоновка С++

Вы не выполняете статическое связывание (потому что в командной строке вы переопределяете -static на -Bdynamic).

Ошибка означает, что исполняемый файл запрашивает интерпретатор ELF, которого нет в вашей системе. Запуск readelf -Wl ../bin/executable покажет вам, какой это интерпретатор ELF. Найдите такие строки:

  INTERP         0x000318 0x0000000000000318 0x0000000000000318 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Вывод ldd показывает, что фактическим интерпретатором ELF в вашем двоичном файле является /lib/ld64.so.1, и причина этого интерпретатора, вероятно, в том, что GCC перепутал -static (флаг GCC) и -Wl,-Bdynamic (флаг, который не виден драйверу GCC, но перешел непосредственно в ld) смесь.

Вот почему вызов двоичного файла через правильный интерпретатор ELF: /lib64/ld-linux-x86-64.so.2 ../bin/executable работает — в этом случае интерпретатор внутри executable игнорируется.


Поскольку на самом деле вы не делаете ссылку -static, я подозреваю, что удаление -static решит проблему.

Если вам нужна полностью статическая ссылка, вам следует снять все флаги -Wl,..., которые у вас есть в настоящее время, а также отметить, что ваш двоичный файл, скорее всего, не будет работать (по крайней мере, неправильно) ни в одной системе, кроме той, на которой он был связан. Смотрите этот ответ.

Большое спасибо!! Я избавился от проблемы, потому что программа использовала libcurl. однако кажется, что есть статический двоичный файл.

madreblu 16.02.2023 11:50

Мне как-то удалось решить проблему, я скомпилировал библиотеку, которую использовал без libcurl, и мне удалось получить статический двоичный файл. спасибо @Employed Russian и @Quimby!

madreblu 19.02.2023 11:01

Другие вопросы по теме