可执行共享库

5
大多数情况下,编译共享库后执行它是没有意义的,这样做不会产生任何有用的东西。
$ ./libfoobarbaz.so
Segmentation fault

然而,GNU的开发人员已经能够在执行glibc时插入一些输出:
$ /lib/libc.so.6
GNU C Library (Debian EGLIBC 2.11.2-10) stable release version 2.11.2, by Roland McGrath et al.
Copyright (C) 2009 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.4.5.
Compiled on a Linux 2.6.32 system on 2011-01-23.
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
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

虽然这个用法对我来说似乎只是简单的膨胀,但他们是如何实现将共享库作为可执行文件使用的呢?

可能是重复问题:在Unix上执行共享库 - osgx
3个回答

2
本文说明可执行文件和共享对象库使用相同的格式ELF,并且libc.so与crt0.o(在*nixes上)合作,是编译器的一部分,实际负责设置运行时环境,然后调用正确的int main(...)函数。没有链接libc.so和crt0.o,只有int main(...)的程序将无法执行。从技术上讲,将main函数设置为可执行入口点是可能的,但以这种方式启动程序将不会接收命令行参数、环境等,所有这些都由标准运行时库libc.so负责。
因此,libc.so还负责准备调用int main(...)函数,并可以轻松确定它是否被其他程序链接,或者是否是“独立的”。如果进程通过libc.so入口点启动,它将显示此消息,然后退出。只有通过可执行二进制入口点启动进程,该二进制通过那个神奇的crt0.o接收到入口点,进程才会像平常一样运行。

0

这个主题有一个关于如何做的指南。原则是在库中定义一个入口点,并将 ELF 文件的 interp 部分填充为解释器的路径名(例如 /lib/ld-linux.so.2)。


0
答案在于“可执行和链接格式”的名称。相同的文件格式用于可执行文件和库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接