Неопределенные символы для "__mh_execute_header" - PullRequest
0 голосов
/ 25 января 2019

Я строю динамические рамки. Мой фреймворк связан с парой статических библиотек. Когда он работает в симуляторе с примером приложения, он работает нормально. Но когда я пытаюсь заархивировать его с помощью примера приложения, я получаю следующую ошибку от компоновщика.

Undefined symbols for architecture arm64:
  "__mh_execute_header", referenced from:

Так что же такое __mh_execute_header и в каком фреймворке / библиотеке он определен?

1 Ответ

0 голосов
/ 25 января 2019

Это символ, определенный компоновщиком. С вершины <mach-o/ldsyms.h>:

Этот файл описывает символы, определенные редактором ссылок. Семантика символ редактора ссылок означает, что он определяется редактором ссылок, только если на него ссылаются, и это является ошибкой для пользователя, чтобы определить их (см. страница справочника ld (1)). Стандартные символы редактора ссылок UNIX: __end, __etext и __edata не поддерживаются редактором ссылок Apple Mach-O. Эти символы действительно не имеют смысла в объекте Mach-O Поддерживаемые символы редактора файлов и ссылок (описаны здесь) заменить их. В случае стандартных символов редактора ссылок UNIX программа может использовать символ __mh_execute_header и выполните команды загрузки своей программы, чтобы определить окончание (или начало) любого раздела или сегмента в программа. Обратите внимание, что компилятор ставит подчеркивание перед всеми внешними имена символов, закодированные на языке высокого уровня. Таким образом, в «С» имена закодированы без подчеркивания и имена символов в таблице символов имеют подчеркивание. Для каждого имени редактора ссылок есть два макроса cpp в этом файле. Макрос с ведущей нижней чертой - это имя символа а без него имя, закодированное в 'C'.

Специальный символ __mh_execute_header дополнительно описан с помощью (выделение добавлено):

Значением определенного редактором ссылок символа [__mh_execute_header] является адрес заголовка mach в исполняемом типе файла Mach-O. Это делает не отображаются ни в одном типе файла, кроме файла MH_EXECUTE. Тип символа является абсолютным, так как заголовок не является частью какого-либо раздел.

Таким образом, компоновщик определяет __mh_execute_header только при связывании исполняемого файла, а не библиотеки, инфраструктуры или пакета.

Если ваш код фреймворка не ссылается на _mh_execute_header, то ссылка, вероятно, исходит от используемых вами статических библиотек. И то только при сборке для arm64. Это плохо для этих библиотек, так как они могут использоваться только в исполняемом файле, а не в фреймворке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...