strace: SIGFPE, прежде чем что-то случится - PullRequest
1 голос
/ 22 февраля 2011

У меня проблемы с выполнением программы на С ++ на конкретной машине. Вот весь вывод strace:

26936 execve("/data1/xfm/bin/xfm", ["/data1/xfm/bin/xfm", "-d", "-s", "/data1/smail/", "-p", "/data1/xfm", "-m", "Mailing.176"], [/* 21 vars */]) = 0
26936 uname({sys="Linux", node="smail2.<removed>.com", ...}) = 0
26936 brk(0)                            = 0x98f7000
26936 --- SIGFPE (Floating point exception) @ 0 (0) ---
26936 +++ killed by SIGFPE +++

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

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

Я полагаю, что на проблемной машине установлен более старый дистрибутив Linux, чем у других: насколько я знаю, обычной причиной этого является несоответствие между хэш-таблицей символов в двоичном файле и динамической линкер.

Динамически связанный двоичный файл (или библиотека в этом отношении) может иметь либо классическую хэш-таблицу символов ELF в разделе с именем .hash, либо новую хеш-таблицу символов GNU в разделе с именем .gnu.hash, либо оба вместе.

В некоторых более поздних дистрибутивах gcc настроен на передачу флага компоновщику (--hash-style=gnu) по умолчанию, что заставляет его выдавать только двоичный раздел .gnu.hash.

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

0 голосов
/ 22 февраля 2011

Трудно дать ответ, имея только эту информацию.Вы должны попытаться запустить вашу программу в gdb или вставить обработчик сигнала sigfpe, чтобы определить точную позицию ошибки и ее причину.

...