我正在尝试获取ELF二进制文件的加载地址,但dlopen不能按预期工作:
void *elf = (char *)dlopen (0, RTLD_NOW);
printf ("%p\n", elf);
sleep (100);
Run Code Online (Sandbox Code Playgroud)
它打印0xb772d918,但是从/proc/1510/maps讲述,它并不指向的加载地址dlfn二进制,但是ld-2.15.so,
08048000-08049000 r-xp 00000000 fc:00 1379 /root/dlfn
08049000-0804a000 r--p 00000000 fc:00 1379 /root/dlfn
0804a000-0804b000 rw-p 00001000 fc:00 1379 /root/dlfn
b7550000-b7552000 rw-p 00000000 00:00 0
b7552000-b76f5000 r-xp 00000000 fc:00 9275 /lib/i386-linux-gnu/libc-2.15.so
b76f5000-b76f7000 r--p 001a3000 fc:00 9275 /lib/i386-linux-gnu/libc-2.15.so
b76f7000-b76f8000 rw-p 001a5000 fc:00 9275 /lib/i386-linux-gnu/libc-2.15.so
b76f8000-b76fb000 rw-p 00000000 00:00 0
b76fb000-b76fe000 r-xp 00000000 fc:00 9305 /lib/i386-linux-gnu/libdl-2.15.so
b76fe000-b76ff000 r--p …Run Code Online (Sandbox Code Playgroud) 我有一个主要的应用程序,动态加载一个dylib,从内部dylib我想从我的主程序调用导出的函数.我使用dlopen(NULL,flag)来获取我的主要应用 handle,并dlsym(handle, symbol)得到了function.
dlopen给人no error但是当我尝试dlsym我function我得到如下error:
dlerror dlsym(RTLD_NEXT, CallMe): symbol not found
Run Code Online (Sandbox Code Playgroud)
导出的符号由nm确认更正
我不知道为什么RTLD_NEXT会有?这是结果dlopen(NULL,flag)吗?
我该如何解决这个问题或实现我的目标?
还是有其他方法来调用主应用程序(最好不要通过传递函数指针到dylib)?
提前致谢!
添加:
出口:
extern "C" {
void CallMe(char* test);
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
NSLog(@"CallMe with: %s",test);
}
Run Code Online (Sandbox Code Playgroud)
nm的结果
...
0000000000001922 T _CallMe
..
Run Code Online (Sandbox Code Playgroud)
dylib中的代码:
void * m_Handle;
typedef void CallMe(char* test);
CallMe* m_Function;
m_Handle = dlopen(NULL,RTLD_LAZY); …Run Code Online (Sandbox Code Playgroud)