运行时的C未定义符号

时间:2017-04-18 23:55:37

标签: c dynamic-linking

我继承了我正在尝试构建和运行的代码库。我以前能够这样做,但现在在不同的系统上我得到一些运行时错误,即使编译顺利。我对C很陌生,并希望有任何建议继续前进。

具体来说,我有一个常用实用程序的目录common,它被内置到共享库中,当主程序尝试使用共享库中的符号时,我得到如下错误:

some_file.so: undefined symbol: CUSTOM_LOG_LEVEL

符号在头文件custom_log.h中声明,如下所示:

extern int CUSTOM_LOG_LEVEL;

符号在custom_log.c文件中定义,如下所示:

int CUSTOM_LOG_LEVEL = DEFAULT_CUSTOM_LOG_LEVEL;

这些记录器文件包含在其他常用实用程序的目录中,这些实用程序全部放在文件common.h中。以下是记录器包含在公共库中的方式:

#include "custom_log.h"

运行configure,make和make install之后,lib目录的相关内容如下所示:

libsomething_common.so -> libsomething_common.so.0.0.0
libsomething_common.so.0 -> libsomething_common.so.0.0.0
libsomething_common.so.0.0.0

所以有一些符号链接的.so文件,他们最终指向的文件是libsomething_common.so.0.0.0。使用objdump命令分析文件会产生以下结果:

$ objdump -t libsomething_common.so.0.0.0 | grep CUSTOM_LOG_LEVEL
0000000000209a20 l     O .data  0000000000000004              CUSTOM_LOG_LEVEL
$ objdump -T libsomething_common.so.0.0.0 | grep CUSTOM_LOG_LEVEL

所以我们可以看到符号不是动态的,我相信它应该是。但是如何实现呢?

同样,我对这个构建过程非常陌生,并感谢您提出的任何建议。

0 个答案:

没有答案