В Linux, что может заставить dlopen испускать SIGFPE? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть библиотека сомнительного происхождения, которая идентифицируется file как 32-битный исполняемый файл. Однако, когда я пытаюсь dlopen установить его на 32-битной машине CentOS 4.4, dlopen завершается с SIGFPE. Конечно, если с форматом двоичного файла что-то не так, dlopen должен обработать ошибку?

Итак, вопрос в том, какие проблемы могут привести к тому, что длопен испускает SIGFPE?

1 Ответ

5 голосов
/ 23 апреля 2010

Некоторые возможные причины:

  1. Деление на ноль (исключить это с помощью GDB)
  2. Несоответствие архитектуры (вы сами скомпилировали DSO на той же архитектуре? Или это предварительно?)
  3. Проблемы совместимости ABI (загрузка DSO, созданного для одного дистрибутива Linux, в другом).

Здесь - интересное обсуждение, касающееся генерации хеша в формате ELF в системах GNU, где несовпадение ABI может вызвать SIGFPE в системах, когда вы смешиваете и сопоставляете DSO, не построенные в этом дистрибутиве / системе.

Запустите GDB для вашего исполняемого файла с помощью:

]$ gdb ./my_executable
(gdb) run

Когда программа вылетает, вернитесь назад с помощью

(gdb) bt

Если стек заканчивается do_lookup_x (), то, вероятно, у вас возникла та же проблема, и вы должны убедиться, что ваш DSO подходит для системы, в которую вы пытаетесь его загрузить ... Однако вы говорите, что у него сомнительные источники так что проблема, вероятно, является проблемой ABI, аналогичной описанной.

Получить сомнительную библиотеку / исполняемый файл! ;)

Удачи

...