связывание беспорядка с libc

Asked
Viewd530

0

У меня есть библиотека, скомпилированная в файл .a, связанная с моим приложением.(iphone, разработка в Xcode)

Вроде все в порядке, линковка вроде прошла успешно, но когда я запускаю программу, происходит сбой.Сбой происходит при вызове memcmp () в статически связанной библиотеке.Отладчик показывает все виды вещей, которые называются с "dyld" в их именах, поэтому кажется, что по какой-то причине он не может разрешить memcmp, начинает искать динамические библиотеки, а затем терпит неудачу.

AFAIK memcmp находится в libc, поэтому проблем быть не должно.(попытался также передать -lc компоновщику, и это не помогло, как я и ожидал)

Так как же он должен работать?Почему статически подключаемая библиотека не может использовать что-либо из libc?Как мне его скомпилировать?

Спасибо

  • Библиотека, которую вы связали со своим приложением, написана вами самостоятельно?- Не могу не подозревать, что он использует неинициализированный или нулевой указатель.Или, может быть, вы неправильно используете библиотеку, что приводит к неверному указателю?Что говорит обратная трассировка?

    James Morris14 ноября 2009, 00:17
  • Нет, это широко используемая библиотека, надежно работающая на многих платформах, и она дает сбой с самого начала из-за функции инициализатора.Тот же фрагмент кода (фактически 2 вызова функций для настройки). Обратная трассировка указывает на функцию memcmp.(библиотека была скомпилирована в режиме отладки)

    17 ноября 2009, 15:48

2 ответов

0

Возможно, кому-то будет полезно, если я расскажу, в чем была проблема:

Библиотека не была скомпилирована для той же версии ОС, что и основная программа, поэтому ожидалось, что библиотека будет отличаться от той, которая была обнаружена при запуске.

0

libc явно динамически связана на вашей платформе.Соответствующая версия не может быть найдена во время выполнения, чтобы удовлетворить зависимость, созданную во время связывания.

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

  • Некоторые компиляторы обрабатывают memcmp () как внутреннюю функцию.То есть, если вы его вызываете, он помещает код для его реализации вместо вызова библиотечной функции.

    Southern Hospitality19 ноября 2009, 07:46
  • Странно то, что я могу вызвать memcmp () из своей основной программы, но библиотека по-прежнему не может ее использовать.

    17 ноября 2009, 15:49