C++ 延迟符号的dlopen解析
我想通过使用C++ 延迟符号的dlopen解析,c++,c,macos,dlopen,dyld,C++,C,Macos,Dlopen,Dyld,我想通过使用mmap分配可执行区域来存储我的动态库可执行代码,从而编写一个模拟dlopen功能的工具 然后,它必须通过查找符号表来定位符号地址。 它似乎工作得很好,因为我只需要找到API符号地址(分配的库的起始地址的偏移量+该库中符号的偏移量)。。对库中其他函数的间接调用是正确的,因为操作码调用使用相对地址 但是,在具有读写权限的\u数据段的\u la\u symbol\u ptr部分中定义了一些特殊符号。 看起来dlopen应该将实现放在运行时(请参阅下面从hopper reverser工具获
mmap
分配可执行区域来存储我的动态库可执行代码,从而编写一个模拟dlopen功能的工具
然后,它必须通过查找符号表来定位符号地址。
它似乎工作得很好,因为我只需要找到API符号地址(分配的库的起始地址的偏移量+该库中符号的偏移量)。。对库中其他函数的间接调用是正确的,因为操作码调用使用相对地址
但是,在具有读写权限的\u数据
段的\u la\u symbol\u ptr
部分中定义了一些特殊符号。
看起来dlopen应该将实现放在运行时(请参阅下面从hopper reverser工具获取的空存根)
我想知道在运行时加载这个符号的动机是什么。链接器从何处获取实现,谁在更改实现的位置,dlopen还是dyld(我的可执行文件中的代码)
那么关于C还是C++的问题呢?他们不是同一种语言。”坦布尔,我的实验实际上是在C中,但我也试图理解C++的情况。
; Section __la_symbol_ptr
; Range: [0x1010; 0x1018[ (8 bytes)
; File offset : [4112; 4120[ (8 bytes)
; Flags: 0x7
; S_LAZY_SYMBOL_POINTERS
_printf_ptr:
0000000000001010 dq _printf ; DATA XREF=imp___stubs__printf
0000000000001018 db 0x00 ; '.'
0000000000001019 db 0x00 ; '.'
000000000000101a db 0x00 ; '.'
000000000000101b db 0x00 ; '.'
000000000000101c db 0x00 ; '.'
000000000000101d db 0x00 ; '.'
000000000000101e db 0x00 ; '.'
000000000000101f db 0x00 ; '.'
0000000000001020 db 0x00 ; '.'
...
..
.