首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在Linux中直接启动共享库?

为什么不能在Linux中直接启动共享库?
EN

Stack Overflow用户
提问于 2010-10-05 09:00:42
回答 3查看 1.6K关注 0票数 3
代码语言:javascript
复制
$ 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很简单:

代码语言:javascript
复制
void* d = dlopen(argv[1], RTLD_LAZY);
void* m = dlsym(d, argv[2]);
return ((int(*)(int,char**,char**))m)(argc-2, argv+2, envp);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-05 11:57:31

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

ELF报头包含起始地址。

票数 4
EN

Stack Overflow用户

发布于 2010-10-05 09:05:56

共享库并不是设计成可以直接运行的。它们被设计成链接到另一个代码库。它可能有一个可用的入口点,但要成为可执行的,需要的不仅仅是一个可用的入口点。rundll实用程序证明了这一点。您的第二个测试表明,共享库确实是可执行的,但前提是rundll完成了一些工作。如果您想知道在执行库代码之前需要做些什么,可以看看rundll的源代码。

票数 3
EN

Stack Overflow用户

发布于 2010-10-05 10:14:13

您可以在Linux中启动共享库。

例如,如果启动/lib/libc.so.6,它将打印出其版本号:

代码语言:javascript
复制
$ /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>.

您的库中一定缺少了一些东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3860219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档