从静态库,其目标文件和-fPIC有联系创建共享对象(Creating shared object f

2019-10-17 06:26发布

对于一个项目,我们正在试图创建导出一组在特定函数的共享对象文件libname.exports 。 当然,我们知道,从该目标文件.so文件被链接必须使用创建-fPIC ,让一直照顾。 然后,我们将目标文件组合成一个压缩文件名为libname.a 。 现在,这应该是基础的.so要创建文件-或者说,他的想法。

我们传递libname.exports--retain-symbols-file ,所以预期的行为是,链接器会拉在任何的.a有关这些符号的成员。

然而,输出nm libname.so是空的。 在另一方面中grepping nm libname.a显示,在名为相关符号libname.exports在存在.a成员。

现在,我绊了--whole-archive ,因此从调整的命令行:

gcc -o libname.so -shared -Wl,-z,defs,--retain-symbols-file,libname.exports,-L. libname.a -lc

至:

gcc -o libname.so -shared -Wl,-z,defs,--retain-symbols-file,libname.exports,-L.,--whole-archive,libname.a,--no-whole-archive -lc

这似乎具有从包括所有的目标文件的预期效果.a (虽然大小差异奇怪)。 然而, nm libname.so仍然给我任何输出。

如何使用归档文件创建仅在名为符号的共享对象libname.exports可见?

不幸的是如何创建静态库的共享对象文件并没有完全回答我的问题。

注意:你问了。 背后使用的想法.a文件作为输入,是因为它可以很容易地在使用模式规则GNUmakefile而且由于.a与文件-fPIC不管是必要的。 不应该有单独的对象文件链接与存档文件之间的任何差异。

Answer 1:

您可以使用-u SYMBOL选项强制对象从归档读入。

% cc -c -fPIC a.c
% nm a.o
00000000 T a
% ar rv liba.a a.o
ar: creating liba.a
a - a.o
% gcc -o liba.so -shared -u a liba.a
% nm liba.so | awk '$3 == "a" { print }'
0000042c T a

有一两件事要检查将与被指定的符号的拼写--retain-symbols-file 。 例如,在C ++代码编译中的对象符号名称有可能被错位:

% g++ -c -fPIC a.c
% nm a.o | awk '$2 == "T" { print }'
00000000 T _Z1av


文章来源: Creating shared object from static library whose object files were linked with -fPIC