$ 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);当尝试加载二进制文件时,为什么不在内部使用它?
发布于 2010-10-05 11:57:31
main不是内核或动态链接器所识别的入口点-它是由编译时链接到可执行文件中的启动代码调用的(默认情况下,此类启动代码不会链接到共享库中)。
ELF报头包含起始地址。
发布于 2010-10-05 09:05:56
共享库并不是设计成可以直接运行的。它们被设计成链接到另一个代码库。它可能有一个可用的入口点,但要成为可执行的,需要的不仅仅是一个可用的入口点。rundll实用程序证明了这一点。您的第二个测试表明,共享库确实是可执行的,但前提是rundll完成了一些工作。如果您想知道在执行库代码之前需要做些什么,可以看看rundll的源代码。
发布于 2010-10-05 10:14:13
您可以在Linux中启动共享库。
例如,如果启动/lib/libc.so.6,它将打印出其版本号:
$ /lib/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.0 20100520 (prerelease).
Compiled on a Linux 2.6.34 system on 2010-05-29.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.您的库中一定缺少了一些东西。
https://stackoverflow.com/questions/3860219
复制相似问题