创建最小共享库

时间:2015-08-16 06:13:14

标签: c++ linker shared-libraries ld dynamic-linking

对于后台,我正在创建一些C ++软件,它使用动态加载的共享库插件来进行硬件输出(这里的细节与此无关)。

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

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

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

示例:对于源文件main.cppa.cppb.cppa.hb.h,其中main.cpp和{{1}两者都包括a.cpp

b.h构建对象文件gcc -fPIC -c *.cpp -I.main.oa.o

b.o从目标文件中构建最终的可执行文件gcc -o main.out *.o ... 包括未使用的ao。main.out应解决此问题。)< / p>

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

1 个答案:

答案 0 :(得分:1)

  

有没有办法为链接器提供主对象文件,并创建一个只包含它所依赖的对象的共享库?

是:将所有对象打包到存档库liball.a中,然后链接如下:

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

然后链接器将从liball.a中取出a.o依赖的所有对象,这些对象,如here所述。

注意:liball.a可能包含a.o,没有任何损害(如上所述链接说明)。

<强>更新

  

有没有办法在不需要先创建存档的情况下执行此操作?

我不知道有任何可移植的方法。 Gold linker--start-lib--end-lib命令行标记achieve exactly that