Linux可执行文件作为共享库

5

我正在尝试编译一个可执行文件,同时也想将其用作共享库。当我清楚地将其编译和链接为"可执行文件"时,一切都很好-文件可以启动并正常工作。在这个阶段,我无法正确地将其他库与其链接(日志中有大量重新定义)。当我尝试添加选项-Fpic-shared-程序成功编译,但以分段错误开始。我如何使它既可执行又是“共享库”?


你能展示一下错误吗?我已经在Linux下编译了启用了“共享库”的库和可执行文件,并没有遇到你所描述的问题。因此这是可能的。 - Noam Rathaus
1
一个文件不能同时既是可执行文件又是共享库。 - n. m.
1
你为什么想要这样做?唯一的例子是/lib/libc.so.6... - Basile Starynkevitch
我有一些“解决方案”,我正在使用-rdynamic选项将我的模块构建为共享库。 - qmor
显然我错了,@JohnZwick也错了。请查看此处 - n. m.
1个回答

7
一个文件不能同时成为共享库和可执行文件。但是您可以将对象文件链接两次来实现这两个目的。做法如下:
g++ -c -o module.o module.cpp # create an object that has no main()
g++ -shared -fPIC -o libmodule.so module.o # build shared library
g++ -o program module.o main.cpp # build executable

或者,最后一行可以链接共享库(在这种情况下,您需要在运行可执行文件时拥有该库):

g++ -o program -l module main.cpp

6
在许多系统上,“libc.so.6”既是共享库又是可执行程序,这是错误的。 - Basile Starynkevitch
2
技术上正确——最好的正确!但是无论如何,99.99%的可执行文件不是共享对象,反之亦然。假设你“可以”,但也“可能不会”。我还尝试在Mac OS X上执行我的libc,但它不能。 - John Zwinck
6
这个答案是不正确的(至少在Linux上是这样):请参阅https://dev59.com/LHM_5IYBdhLWcg3wRw51#1451482。 - Employed Russian

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