asm*_*rer 9 macos dynamic-linking dyld
OS X动态加载器经常会出现错误
Symbol not found: <some symbol name>
Referenced from: <lib location>
Expected in: flat namespace
Run Code Online (Sandbox Code Playgroud)
如果你搜索错误,你会发现很多错误.我粗略地理解这个问题是一个错误的链接,但没有一个答案解释了"平面命名空间"在这里的意思.
免责声明:此答案仅适用于macOS 10.4及更高版本。例如,在先前版本的“ OSX”中,平面命名空间是默认名称空间。在Windows上,解析也可以略有不同,具体取决于模式。
让我们首先谈谈命名空间的背景。在MacOS中,有两个所谓的名称空间可用。两级名称空间和单个名称空间(也称为平面名称空间)。
平面命名空间
每个过程都有一个巨大的表,其中包含所有符号(函数,外部变量,..)。加载库时,它可能取决于符号,因此可以在平面命名空间中查找以找到其他哪个库或可执行文件。找到所有符号后,库将自己的符号添加到列表中。一个巨大的缺点是可能发生的碰撞数量。一个进程可能会加载两个或多个具有相同符号名称的库。由操作系统决定如何处理冲突,但是在大多数情况下,这只是未定义的行为,并且由于混合库而导致崩溃。
两级名称空间
在两级名称空间中,将使用名称和它们的库名(以及它们的来源)来保存符号,而不是使用带有符号名的普通表。依赖符号的库需要确切地知道要从哪个库中获取符号XYZ的解析。
lib显然是使用flat-namespace选项编译的,并且需要使用符号 正常运行。一种解决方案是在加载导致问题的lib之前加载它依赖的库。
寻找问题的解决方案也很有趣:
otool -hV
在库上运行。如果看不到TWOLEVEL
,则与链接-flat-namespace
。
归档时间: |
|
查看次数: |
3450 次 |
最近记录: |