Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX 10.5 Leopard符号与$non_lazy_ptr一起损坏_Macos_Osx Leopard_Name Mangling_Darwin_Non Lazy Ptr - Fatal编程技术网

Macos OSX 10.5 Leopard符号与$non_lazy_ptr一起损坏

Macos OSX 10.5 Leopard符号与$non_lazy_ptr一起损坏,macos,osx-leopard,name-mangling,darwin,non-lazy-ptr,Macos,Osx Leopard,Name Mangling,Darwin,Non Lazy Ptr,为什么Leopard会用$non_lazy_ptr弄坏一些符号?更重要的是,修复未定义符号错误的最佳方法是什么,因为符号已被$non_lazy_ptr?损坏。来自: 间接寻址是代码生成技术的名称,该技术允许从另一个文件引用一个文件中定义的符号,而无需引用文件明确了解定义符号的文件布局。因此,可以独立于引用文件修改定义文件。间接寻址将动态链接器必须修改的位置数量降至最低,这有助于代码共享并提高性能 当文件使用在另一个文件中定义的数据时,它将创建符号引用。符号参照标识从中导入符号的文件和参照符号。有

为什么Leopard会用$non_lazy_ptr弄坏一些符号?更重要的是,修复未定义符号错误的最佳方法是什么,因为符号已被$non_lazy_ptr?损坏。

来自:

间接寻址是代码生成技术的名称,该技术允许从另一个文件引用一个文件中定义的符号,而无需引用文件明确了解定义符号的文件布局。因此,可以独立于引用文件修改定义文件。间接寻址将动态链接器必须修改的位置数量降至最低,这有助于代码共享并提高性能

当文件使用在另一个文件中定义的数据时,它将创建符号引用。符号参照标识从中导入符号的文件和参照符号。有两种类型的符号引用:非惰性和惰性

加载模块时,动态链接器解析(绑定到其定义)非惰性符号引用。 非惰性符号引用本质上是一个符号指针——一个指针大小的数据块。编译器为数据符号或函数地址生成非惰性符号引用

惰性符号引用在第一次使用时(不是在加载时)由动态链接器解析。对引用符号的后续调用直接跳转到符号的定义。
惰性符号引用由一个符号指针和一个符号存根组成,这是一小部分直接取消引用并跳过符号指针的代码。编译器在遇到对另一个文件中定义的函数的调用时生成惰性符号引用。

用人类的话说:编译器生成存根,并在存根后面附加$non_lazy_ptr以加速链接。您可能会看到从_Foo$non_lazy_ptr引用的函数Foo是未定义的,或者类似的东西-这些不是同一件事。确保该符号已在应用程序链接到的对象文件/库中实际声明和导出。至少这是我的问题,我还认为这是一个奇怪的链接器问题,直到我发现我的问题在其他地方-在谷歌上找到了几个其他可能的原因。

ranlib-c在你的库文件中修复了这个问题

如果其他人遇到了我遇到的同样问题:

有一个
extern NSString*const someString在头文件中,但忘记将其放在实现文件中。as
NSString*const someString=@“someString”

这就解决了问题

ranlib -c libwhatever.a
是解决这个问题的可靠方法。我在为iOS构建PJSIP库时遇到了同样的问题。这个库使用了一个基于autoconf的make系统,但需要对各种文件进行一些调整,以使iOS的一切正常。在这样做的过程中,我成功地删除了库规则中的ranlib行,然后开始在我的项目链接中发现一个错误,关于
\u PJ\u NO\u MEMORY\u EXCEPTION
引用自
\u PJ\u NO\u MEMORY\u EXCEPTION$non\u lazy\u ptr
未定义

将ranlib行添加回库文件解决了此问题。现在我在rules.mak中的LIBS完整条目是

$(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)
希望这也能帮助其他尝试在iPhone或iOS上使用通用UNIX配置的外部库的人