不同版本的gcc中的不同符号表导致错误的链接

时间:2017-03-31 15:05:11

标签: c gcc makefile shared-libraries name-conflict

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

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

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

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

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

使用gcc-5.4.0进行编译时,不会显示此日志条目。

在生成.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

0 个答案:

没有答案