添加“extern C”作为符号的编译器选项?

问题描述 投票:0回答:1

我正在使用支持 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"

c++ c gcc extern
1个回答
4
投票

在编译命令行上的文件之前提供

-x c
开关和
g++
将强制将其编译为 C 文件而不是默认的 C++。

来自 Fipsld 和 C++ 页面:

打开 fipsld++ 并查找编译 fips_premain.c 的地方。它是通过变量{PREMAIN_C}编译的...

更改这些行,使 -x c 位于“${PREMAIN_C}”之前,而 -x none 位于其后面。

${CC}  ${CANISTER_O_CMD:+"${CANISTER_O_CMD}"} \
    -x c "${PREMAIN_C}" -x none \
    ${_WL_PREMAIN} "$@"

在 fips_premain.c 上强制进行 C 编译适用于所有配置(库、共享对象和可执行文件),因此您可以安全地将其应用于 fipsld++ 的所有部分。

© www.soinside.com 2019 - 2024. All rights reserved.