【问题标题】:Linux executable file as shared libraryLinux 可执行文件作为共享库
【发布时间】:2014-01-14 00:02:39
【问题描述】:

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

【问题讨论】:

  • 你能显示错误吗?我已经在启用了shared library 的情况下在 linux 下编译了库和可执行文件,并且没有您描述的问题。所以这是可能的。
  • 单个文件不能既是可执行文件又是共享库。
  • 你为什么要这样做?唯一的例子是/lib/libc.so.6 ...
  • 我有一些“解决方案”,我只是使用 -rdynamic 选项将我的模块构建为共享库。
  • 显然我错了,@JohnZwick 也是。见here

标签: c++ linux gcc


【解决方案1】:

单个文件不能同时是共享库和可执行文件。但是您可以链接您的目标文件两次以创建两者。它会是这样的:

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

【讨论】:

  • 这是错误的:在许多系统上libc.so.6 既是共享库又是可执行程序。
  • 技术上正确——最好的正确!但无论如何,99.99% 的可执行文件不是共享对象,反之亦然。假设您“可以”,但您“可能不会”。我也尝试在 Mac OS X 上执行我的 libc,但它不能。
  • 这个答案不正确(至少在linux上):见stackoverflow.com/a/1451482/50617
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2010-12-19
  • 2023-03-15
  • 2012-08-13
  • 2015-09-05
  • 2022-01-19
相关资源
最近更新 更多