OSX 10.5 Leopard Symbol Mangling с $ non_lazy_ptr - PullRequest
3 голосов
/ 17 сентября 2008

Почему Леопард искажает некоторые символы с помощью $ non_lazy_ptr? Что еще более важно, каков наилучший способ исправить неопределенные ошибки символов, потому что символ был искажен с $ non_lazy_ptr?

Ответы [ 5 ]

5 голосов
/ 17 сентября 2008

От: Связь с разработчиком - косвенная адресация

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

Когда файл использует данные, определенные в другом файле, он создает ссылки на символы. Ссылка на символ идентифицирует файл, из которого импортируется символ, и ссылочный символ. Существует два типа ссылок на символы: неряхи и ленивцы.

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

Ленивые ссылки на символы разрешаются динамическим компоновщиком при первом использовании (не во время загрузки). Последующие обращения к ссылочному символу переходят непосредственно к определению символа. Ленивые ссылки на символы состоят из указателя символа и заглушки символа, небольшого количества кода, который непосредственно разыменовывается и перепрыгивает через указатель символа. Компилятор генерирует ленивые ссылки на символы, когда сталкивается с вызовом функции, определенной в другом файле.

3 голосов
/ 14 ноября 2008

Говоря по-человечески: компилятор генерирует заглушки с присоединенным к ним $ non_lazy_ptr для ускорения линковки. Вы, вероятно, видите, что функция Foo, на которую ссылается _Foo $ non_lazy_ptr, не определена или что-то в этом роде - это не одно и то же. Убедитесь, что символ действительно объявлен и экспортирован в объектных файлах / библиотеках, с которыми вы связываете свое приложение. По крайней мере, это была моя проблема, я также думал, что это странная вещь компоновщика, пока не обнаружил, что моя проблема была в другом месте - есть несколько других возможных причин, найденных в Google.

2 голосов
/ 12 августа 2010
ranlib -c libwhatever.a

- это серьезное решение проблемы. У меня была такая же проблема при сборке библиотеки PJSIP для iOS. Эта библиотека использует систему make, основанную на autoconf, но требует небольшой настройки различных файлов, чтобы все было хорошо для iOS. В процессе этого мне удалось удалить строку ranlib в правиле для библиотек, а затем я начал получать сообщение об ошибке в ссылке моего проекта о том, что _PJ_NO_MEMORY_EXCEPTION ссылается на _PJ_NO_MEMORY_EXCEPTION$non_lazy_ptr, что не определено.

Добавление строки ranlib обратно в файл библиотеки решило эту проблему. Теперь моя полная запись для LIBS в rules.mak:

$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
    if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
    $(LIBTOOL) -o $(LIB) $(OBJS)
    $(RANLIB) -c $(LIB)

Надеюсь, это поможет и другим, пытающимся использовать общие внешние библиотеки, настроенные для UNIX, с iPhone или iOS.

1 голос
/ 17 июня 2010

Если кто-то другой споткнется о той же проблеме, что и у меня:

Имел extern NSString* const someString; в заголовочном файле, но забыл поместить его в файл реализации. как NSString* const someString=@"someString";

Это решило это.

0 голосов
/ 29 июня 2009

ranlib -c в вашем файле библиотеки решает проблему

...