创建一个最小的共享库

Creating a Minimal Shared Library

作为背景,我正在创建一些 C++ 软件,这些软件使用动态加载的共享库插件进行硬件输出(它的细节在这里不相关)。

我正在构建可执行文件,方法是将所有内容编译到目标文件中,然后链接所需的文件,使用排除列表很简单。然后,我可以通过指定其主目标文件(在运行时动态加载和访问的目标文件)以及主目标文件引用的所有其他目标文件来构建共享库。

我的问题是:有没有办法为链接器提供主要目标文件,并创建一个仅包含它所依赖的对象的共享库?所有目标文件都在同一个目录中,我没有使用 Makefile(目前;如果可以解决问题,这是一个有效的答案),编译速度不是问题。

我查看了链接器选项 --as-needed--gc-sections--no-undefined,但我无法拼凑出一个有效的构建过程。

示例:对于源文件 main.cppa.cppb.cppa.hb.h,其中 main.cppa.cpp 都包括 b.h:

gcc -fPIC -c *.cpp -I. 构建目标文件 main.oa.ob.o.

gcc -o main.out *.o 从目标文件构建最终的可执行文件 main.out...包括未使用的 a.o。 (--gc-sections 应该解决这个问题。)

gcc -fPIC -shared -o a.so a.o -Wl,--as-needed !(a).o 从所有目标文件构建最终的共享库 a.so...包括未使用的 main.o。如何防止 main.o 包含在 a.so 中?

Is there a way to provide the linker with the primary object file, and create a shared library containing only the objects it depends upon?

是:将所有对象打包到归档库中liball.a,然后link像这样:

gcc -shared -o a.so a.o liball.a

然后 linker 将从 liball.a 中取出 a.o 依赖的所有对象,并且 这些对象,如所解释的here.

注意:liball.a可能包含a.o,没有害处(如上link说明)。

更新:

Is there a way to do it without needing to create an archive first?

我不知道有什么可移植的方法可以做到这一点。 Gold linker has --start-lib and --end-lib command line flags that achieve exactly that.