0

我正在尝试编译一段将多个源文件与共享库链接的代码。这是为了避免与源代码和共享库中名为Log的函数发生名称冲突。

我的源代码中的签名是Log(int, char *, char *, ...),共享库中的签名是Log(int, int, char *, ...))

需要为不同的目标构建代码。使用 gcc-5.4.0 (Ubuntu 16.04) 构建时,没有冲突,共享库正确调用共享库中的 Log 函数。但是,在为 armhf (BeagleBoneBlack) 构建 gcc-4.9.2 时,共享库在我的源代码中调用了不正确的Log函数。

具体来说,应用到使用 gcc-4.9.2 生成的可执行文件的nm命令的输出显示了动态符号表中的第一个条目,如下所示:

$ nm -D <filename>
00017590 T Log 
.....   

使用 gcc-5.4.0 编译时,不会出现 Log 的此条目。

在生成 .so 文件时,我尝试使用objcopy替换Log符号名称,但这不起作用。

Makefile 中是否有一些设置或标志需要添加,以便任何版本的 gcc 都不应该将Log函数添加到我的最终可执行文件的动态符号中?还是我在这里缺少其他东西?

重现 Makefile 设置:

CFLAGS=-fPIC -MMD -Wall -std=c99 -D_GNU_SOURCE -g -Werror=implicit
CPPFLAGS=-Iinclude
CFLAGS+=-Os -fdata-sections -ffunction-sections -flto
CPPFLAGS+=-Os -fdata-sections -ffunction-sections -flto
LDFLAGS=-Os -Wl,--gc-sections -flto
4

0 回答 0