$ 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);
为什么在尝试加载二进制文件时不在内部使用?
答案 0 :(得分:4)
main
不是内核或动态链接器识别的入口点 - 它在编译时链接到可执行文件中的启动代码调用(默认情况下,此类启动代码未链接到共享库) )。
ELF标头包含起始地址。
答案 1 :(得分:3)
共享库不能直接运行。它们被设计为链接到另一个代码库。它可能具有可用的入口点,但是可执行的不仅仅需要具有可用的入口点。 rundll
实用程序证明了这一点。您的第二个测试显示共享库确实是可执行的,但只有在rundll
执行后才能执行。如果您对在执行库代码之前必须完成的工作感到好奇,请查看rundll
的源代码。
答案 2 :(得分:3)
你可以在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>.
您的图书馆必定缺少某些内容。