$ chmod +x libsomelibrary.so
$ ./libsomelibrary.so
Segmentation fault

$ gcc -O2 http://vi-server.org/vi/bin/rundll.c -ldl -o rundll
$ ./rundll ./libsomelibrary.so main
(application starts normally)

如果它具有可用的入口点,为什么我不能仅启动libsomelibrary.so?
rundll.c很简单:
void* d = dlopen(argv[1], RTLD_LAZY);
void* m = dlsym(d, argv[2]);
return ((int(*)(int,char**,char**))m)(argc-2, argv+2, envp);

为什么在尝试加载二进制文件时未在内部使用它?

最佳答案

main不是内核或动态链接器识别的入口点-编译时,链接到可执行文件的启动代码会调用ojit_code(默认情况下,此类启动代码未链接到共享库中)。

ELF header 包含起始地址。

10-05 18:10