相关疑难解决方法(0)

获取ELF二进制文件的加载地址,dlopen未按预期工作

我正在尝试获取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)

c linux dlopen

9
推荐指数
1
解决办法
3300
查看次数

dlopen问题(OSX)

我有一个主要的应用程序,动态加载一个dylib,从内部dylib我想从我的主程序调用导出的函数.我使用dlopen(NULL,flag)获取我的主要应用 handle,并dlsym(handle, symbol)得到了function.

dlopen给人no error但是当我尝试dlsymfunction我得到如下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)

c macos dlopen dlsym

5
推荐指数
1
解决办法
2560
查看次数

标签 统计

c ×2

dlopen ×2

dlsym ×1

linux ×1

macos ×1