我正在尝试编译一段将多个源文件与共享库链接起来的代码。这是为了避免在源代码和共享库中与名为 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