Ада программа для Linux: SIGSEGV из-за отсутствия файла?

Я скомпилировал программу Ada для Linux в Ubuntu 5.4 (GNAT 3.4), используя следующую команду:

gnatmake -O3 myprogram -bargs -static

Когда я запускаю программу на машине с Ubuntu, она работает нормально. Но на другой машине (веб-сервер Linux) я получаю следующее сообщение об ошибке при попытке strace:

execve("./myprogram", ["./myprogram"], [/* 15 vars */]) = 0
brk(0)                                  = 0x811e000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

Что это значит? Правильно ли я понимаю, что программа не может быть запущена из-за отсутствия двух файлов (ld.so.nohwcap и ld.so.preload)? Как я могу избежать этой ошибки? Есть ли возможность включить эти файлы в программу во время компиляции?

3 ответа

Решение

Что это значит?

Это означает, что ваша программа пыталась разыменовать NULL указатель и умер с SIGSEGV

Правильно ли я понимаю, что программа не может быть запущена из-за отсутствия двух файлов (ld.so.nohwcap и ld.so.preload)?

Нет: эти файлы совершенно не существуют, и ваша проблема не имеет к ним никакого отношения.

  1. Инструмент для отладки подобных проблем: gdb, strace редко используется для такой отладки.
  2. Вопреки распространенному мнению, полностью статические исполняемые файлы (как и созданные вами) менее переносимы в Linux, чем динамически связанные. В частности, вы, вероятно, получили предупреждения во время ссылки, аналогичные этой:

    Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

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

Обновить:

Можно ли включить в программу только отсутствующий libgnat?

Это может быть возможно: вам нужно сделать так, чтобы окончательная строка ссылки выглядела так:

gcc ... -Wl,-Bstatic -lgnat -Wl,-Bdynamic ...

Я не знаю, как этого добиться с gnatmake,

Другая, возможно, более простая альтернатива: рассматривали ли вы установку libgnat-3.4.so.1 на сервере?

Вывод, который вы видите из strace - это динамический компоновщик, пытающийся связать в библиотеках

  1. Я могу порекомендовать вам запустить ldd, это покажет вам зависимости
  2. Исправьте зависимости, если это не работает
  3. Если вы перекомпилируете его, используйте флаг -g, чтобы позже отладить его
  4. Если он все еще не запущен, используйте gdb и запустите его, если он выйдет с типом SIGSEV, где

Примечание: всегда проверяйте, чтобы процессор был "точно таким же", иначе перекомпилируйте его на новом компьютере и передайте исполняемый файл как двоичный файл

Страница Man, которую приятно читать

Также имейте в виду, что перемещение программы, скомпилированной на одном компьютере с Linux (Ubuntu 5.4), на другой (веб-сервер) может иметь разные файловые зависимости. Особенно, если они основаны на разных дистрибутивах. Вот описание файлов ld.so.*: прокрутите вниз.

Попробуйте предложение jimw и создайте программу на веб-сервере. GNAT 3.4 является более старой версией, поэтому она может быть недоступна для использования на веб-сервере. Также имейте в виду, совету трудоустроенных русских - не пользуйтесь -static флаг. Вы можете попробовать перекомпилировать вашу программу в Ubuntu без -static Отметьте и запустите новую версию на веб-сервере, но это может не устранить ошибку.

Если перекомпиляция и / или компиляция на веб-сервере не работает, вам придется использовать gdb для отладки вашей программы. Или вы можете опубликовать часть кода здесь и посмотреть, может ли кто-нибудь помочь вам.

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