【发布时间】:2014-03-07 10:52:45
【问题描述】:
我正在使用支持 FIPS 的 OpenSSL。源代码被隔离,无法更改。
要链接到静态版本的 OpenSSL 库,我们需要做的就是:
export FIPS_SIG=`find /usr/local/ssl -iname incore`
export CC=`find /usr/local/ssl -iname fipsld`
export FIPSLS_CC=`find /usr/bin -iname gcc`
然后,只需执行:
$CC $CFLAGS <sources> -o myprogram <openssl libs>
旋转的原因是 OpenSSL 将插入一个额外的源文件 - fips_premain.c - 并与程序源一起编译它。 (发生了一些额外的步骤,但fips_premain.c 的编译是相关步骤)。
但是,当使用g++ 时,有几个符号是未定义的,因为它们是在安装 OpenSSL 时使用 C 编译器编译的,而 g++ 在如上调用时找不到它们:
/tmp/fips_premain-20db15.o: In function `FINGERPRINT_premain()':
/usr/local/ssl/fips-2.0/lib/fips_premain.c:103: undefined reference to `FIPS_text_start()'
/usr/local/ssl/fips-2.0/lib/fips_premain.c:116: undefined reference to `FIPS_incore_fingerprint(unsigned char*, unsigned int)'
如果我添加 --no-demangle 链接器选项,输出如下:
/tmp/fips_premain-be4611.o: In function `_Z19FINGERPRINT_premainv':
/usr/local/ssl/fips-2.0/lib/fips_premain.c:103: undefined reference to `_Z15FIPS_text_startv'
/usr/local/ssl/fips-2.0/lib/fips_premain.c:116: undefined reference to `_Z23FIPS_incore_fingerprintPhj'
以下是fips_premain.c 中感兴趣的行(第 85 行附近):
extern const void *FIPS_text_start(), *FIPS_text_end();
extern const unsigned char FIPS_rodata_start[], FIPS_rodata_end[];
extern unsigned char FIPS_signature[20];
extern unsigned int FIPS_incore_fingerprint(unsigned char *,unsigned int);
有没有办法从命令行将符号标记为extern "C"?
【问题讨论】:
-
你不能在
g++命令行上简单地为fips_premain.c加上-x c前缀吗? -
感谢 mockinterface。我不编译
fips_premain.c。当fipsld遇到对链接器的调用时,它在幕后编译(我认为它缺少-c)。所以我不能挑选它并为它添加一个标志。 -
那么即使你可以从命令行提供
extern C(你不能)你的计划是什么,如果它发生在幕后并且你无权访问它的编译命令行?除非您找到一种方法来挂钩该进程,或者自己重新生成文件,否则您无能为力。 -
是的,好点。叹息.....
-
我还尝试使用
defsym添加符号别名,但它以可怕的方式破坏了事情。那些后端脚本不是很健壮。
标签: c++ c gcc compiler-construction extern