sjc*_*sjc 6 macos mach-o clang ld
mach-o文件中的符号可以标记为"间接"(I在输出中nm,使用常量在标题中定义N_INDR).似乎这种类型的符号在实践中很少使用(或者可能具有非常具体的,有限的用途).我遇到的唯一例子是macOS系统库/usr/lib/system/liblaunch.dylib.这是nm在该文件上运行的部分输出:
U __spawn_via_launchd
0000000000000018 I __spawn_via_launchd
U __vproc_get_last_exit_status
0000000000000049 I __vproc_get_last_exit_status
U __vproc_grab_subset
000000000000007a I __vproc_grab_subset
Run Code Online (Sandbox Code Playgroud)
如此输出所示,相同的符号列出两次,一次U又一次列出I.I对于文件中的所有符号都是如此.
更详细地检查符号表条目显示,当U条目引用另一个链接库(libxpc.dylib)时,I条目不引用任何内容.
搜索"mach-o indirect symbols"似乎没有产生许多有用的结果.大多数,包括Apple的文档,涵盖了用于实现惰性弱符号的存根.我不认为这与I间接符号有关,主要是因为其他文件中的懒弱弱链接符号没有标记为I,但我会很高兴被告知不同.
来自Darwin档案的源文件也缺乏有用的评论.
所以我有3个问题:
什么是间接符号的规范解释?
编译时链接器和加载时链接加载器如何解释和处理这些符号?
如何将源文件中的符号定义为间接?(我最感兴趣的是C/Clang答案,但我相信未来的读者也会欢迎其他语言的答案.)
(对于它的价值,我目前最好的猜测是,这是一种允许在保持兼容性的同时从库中删除符号的方法,只要这些符号在别处可用.一种在编译时保持链接器满意并指向的方法加载时移动实现的链接加载器.但这只是猜测.)
UPDATE
经过一些研究,我可以回答问题3.当然,这是由链接器控制的,我正在寻找的选项是-reexport_symbol.这将I在符号表中创建条目(如果符号尚未存在,它也将创建U条目).还有一个-reexport_symbols_list选项,它采用符号名称文件并为每个符号名称创建间接符号.
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |