Кросс-компиляция libgcrypt для iPhone?Ошибка компоновщика ... похоже, не удается найти “fwrite” и “strerror”?
-
06-07-2019 - |
Вопрос
Я успешно перекрестная компиляция Apache Portable Runtime (APR) для iPhone, используя набор настройка скриптов которые вызывают GNU Autotools "./configure" с необходимыми параметрами кросс-компиляции.
Сейчас я пытаюсь кросс-скомпилировать GNUTLS, который зависит от libtasn1 и libgcrypt, который, в свою очередь, зависит от libgpg-error.Вот тут-то я и столкнулся с неприятностями, и мне могла бы понадобиться ваша помощь...
В настоящее время я пытаюсь кросс-скомпилировать libgpg-ошибка.Скрипты настройки, которые я использовал ранее, работают прекрасно;процесс "./configure" завершается чисто.Проблемы возникают, когда я запускаю "make".Когда я запускаю make, кажется, что все компилируется, но затем я получаю следующую неприятную ошибку компоновщика в конце:
/bin/sh ../libtool --tag=CC --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o ./libgpg-error.la /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a Undefined symbols: "_fwrite$UNIX2003", referenced from: _main in gpg_error-gpg-error.o "_strerror$UNIX2003", referenced from: _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o) ld: symbol(s) not found collect2: ld returned 1 exit status make[3]: *** [gpg-error] Error 1 make[2]: *** [all] Error 2 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2
Есть какие-нибудь идеи о том, как заставить это работать?Версии программного обеспечения, которое я компилирую, следующие:
- libgpg-ошибка:1.7
- libgcrypt - шифрование:1.4.4
- libtasn1:2.2
- гнутлы:2.8.4
Пожалуйста, помогите.Спасибо.
Обновить
Согласно первоначальному отзыву, каждый SDK имеет копию "libSystem.dylib" в "$SDKROOT/usr/lib".В "$DEVROOT/usr/lib" нет копии libSystem, где:
- $DEVROOT = "/Разработчик/Платформы/iPhoneOS.platform/Разработчик"
- $SDKROOT = "$DEVROOT/SDKs/iPhoneOS$ВЕРСИЯsdk"
Библиотеки "libSystem" содержат обычные, недекорированные версии каждого символа, но не содержат вариантов символов "$UNIX2003".Я подозреваю, что GPG-ERROR определяет "_POSIX_C_SOURCE", "_UNIX" или другой макрос тестирования функций UNIX, и что включается мошеннический заголовок, который добавляет "$ UNIX2003" к функциям, когда присутствуют эти макросы тестирования функций.Удаление "$DEVROOT /usr/include" из списка включенных каталогов не влияет на удаление этого сообщения об ошибке.
В качестве последнего средства я вижу, что "ld" принимает опцию "-alias_list", которая позволяет указать файл с записями типа "_fwrite _fwrite $ UNIX2003", чтобы принудительно преобразовать эти неопределенные символы в их недекорированные варианты.Если возможно, я хотел бы избежать этого варианта, поскольку он кажется хакерским и потенциально опасным.
Решение
Обычно неразрешенный символ $UNIX2003 означает, что вы связывание с более старым SDK, чем тот, на основе которого были созданы существующие объектные файлы.
Один странно выглядящий для меня путь включения, и, пожалуйста, обратите внимание, что я лишь смутно знаком с разработкой Mac и совсем не с разработкой iPhone, - это путь
/Developer/Platforms/iPhoneOS.platform/Developer/usr/include
которого на самом деле нет в папке SDK.Возможно ли, что вы позаимствовали оттуда мошеннические символы, если это так, если это они?Кажется маловероятным, поскольку это происходит позже в командной строке, чем пути включения SDK.
Возможно, вместо этого символы являются ожидаемыми версиями _fwrite
и _strerror
и вот gpg_error-gpg-error.o
и libgpg-error.a
все в порядке, и это действительно проблема со связыванием, хотя, опять же, маловероятно, поскольку у вас есть
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib
как вариант a - L.Я предполагаю, что где-то там есть libSystem dylib?
Я думаю, первое, что нужно сделать, это выяснить, соответствует ли версия символа UNIX2003 вашим ожиданиям или нет.Я предполагаю, что это так, но, как я уже сказал, я могу совершенно ошибаться.:)
Во-вторых, вы могли бы попробовать получить подробный вывод из ld
чтобы увидеть, где он находит символы.Я уверен, что есть переменная окружения, которую вы можете установить, чтобы это произошло, но я не вижу ни одной из перечисленных на он-лайн справочной странице для ld
. (Обновить:Двумя переменными env являются LD_TRACE_ARCHIVES
и LD_TRACE_DYLIBS
но, возможно, они дают то же самое, что и -t?).
Редактировать:
Итак, я был совершенно неправ насчет того, что символы UNIX2003 были именно теми, которые были необходимы.лол.
Когда вы создали libgpg-ошибка, я думаю, что она создала файл
src/.deps/gpg_error-gpg-ошибка.Po
который содержит зависимости заголовков (по крайней мере, так было в моей системе Linux).Это может дать ключ к пониманию того, где он взял неправильный заголовок при создании gpg_error-gpg-error.o.
Кстати, похоже, что скрипт настройки libgpg-error принимает оба -isysroot
и -arch
Опции.Разве вы не можете использовать их вместо своей собственной версии скрипта configure?
Редактировать 2:
Ладно, давайте попробуем еще раз :) Вот несколько вещей, которые можно попробовать, начиная с чистой исходной папки:
- используйте -isysroot вместо --sysroot
- используйте -isysroot , а также --sysroot
- временно сделайте ваши обычные системные заголовки недоступными, например, переименовав папку.Надеюсь, сборка завершится неудачно, не сумев найти заголовок, и он точно подскажет вам, где именно.
Другие советы
Попробуйте предварительно обработать gpg_error-gpg-error.c с помощью -E, затем выполните поиск отсутствующих символов.Вы должны найти, откуда есть inclued (что-то вроде asm ("_" "nice" "@UNIX2003").Затем измените этот заголовок (например, unistd.h, чтобы добавить #warning "HERE").Теперь перекомпилируйте, и вы должны найти включаемый стек.
Суффикс $2003 генерируется компилятором при некоторых обстоятельствах, которые вы можете найти полностью документированными в ручном вводе для compat
man compat
Я боролся с этим некоторое время, прежде чем окончательно исправить это, установив
-mmacosx-version-min=10.3
Любая версия, предшествующая версии 10.4, выполнит эту работу.Я подозреваю, что, учитывая ответ Трубадура, мне, возможно, будет лучше искать ошибочно связанные библиотеки, используя опцию -t ld
Надеюсь, это поможет.