【发布时间】:2014-12-05 08:28:17
【问题描述】:
我有几个从构建系统中吐出的目标文件(来自 C++)。他们有几个我想在程序中使用的extern "C"-linkage 符号,并且可以从其他地方通过dlopen/dlsym 访问。
当使用 gcc 编译成可执行文件时,这些符号不会使用 nm -D <executable-here> 列出(即 afaik 它们不是动态符号)。
如何让它们在编译后的可执行文件中显示为动态符号?
我可以更改目标文件和可执行文件的构建标志,但更改 C++ 文件在最终可执行文件中的结束方式(即不首先将它们变成目标文件)是困难的。
(GCC 4.8,ld 2.24)
编辑:我遇到了这个问题,这可能是也可能不是我要问的问题,但我并不完全确定。 Use dlsym on a static binary
【问题讨论】:
-
那么您也想将您的可执行文件用作共享库吗?通常,构建一个供多个应用程序使用的共享库是这里常用的方法。
-
对编辑的回应:是的,它和我的评论说的差不多:要么使用公共共享库,要么不使用
dlopen和dlsym... -
是的...所以,奇怪的是:我在程序中嵌入了一个 Java VM,它使用 JNA/dlopen/dlsym 来访问外部 C 函数。最好将所有内容保存在一个可执行文件中,这样我就不需要在开发过程中弄乱链接器路径。如果我几乎必须制作一个共享库,那么,嗯,好吧……