移动到不同的Linux构build系统,出现错误:undefined symbol:stat

这可能只是我正在迁移到的构build系统的一个问题,但是我将在两个系统中包含差异以及我如何遇到问题。

我的旧版本系统是SLES 10机器。 gcc / cpp / g ++版本是4.1.0

我的新系统在SLES 11 SP4上,而gcc / cpp / g ++版本是4.3.4。

我正在build立一个共享库; 在新系统上build立和连接工作很好。 但是,在新系统加载时,我得到以下结果:

error ./mysharedlib.so: undefined symbol: stat 

由于status()函数包含在/usr/include/sys/stat.h中,所以我在两个系统上查看了glibc。 旧:

 # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.4-31.2 

和新的:

 # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.11.3-17.95.2 

我还查看了旧系统上与stat()相关的objdump输出:

 # objdump -T mysharedlib.so | grep stat 0000000000000000 D *UND* 0000000000000000 __xstat # objdump -x mysharedlib.so | grep stat 00000000000e3f8a l F .text 0000000000000024 stat 0000000000000000 *UND* 0000000000000000 __xstat 

而新系统:

 # objdump -T mysharedlib.so | grep stat 0000000000000000 D *UND* 0000000000000000 stat 0000000000000000 D *UND* 0000000000000000 lstat # objdump -x mysharedlib.so | grep stat 0000000000000000 *UND* 0000000000000000 stat 0000000000000000 *UND* 0000000000000000 lstat 

这告诉我,在旧的系统上,stat()被定义为我的实际共享对象的.text节中的本地函数。 Stat在新系统的mysharedlib中未定义。

我find了关于feature_test_macros的一些信息,并认为可以解决这个问题,所以我在stat.h之前包含了features.h,并更新了我的makefile来定义_XOPEN_SOURCE:

 cc -D_XOPEN_SOURCE=500 

这并没有解决问题。

我也尝试添加“-lc”我的ld标志链接在libc中。 这似乎应该工作,因为这是stat()被定义(我认为),但它没有。

在这一点上,我发现这个StackOverflow问题:

为什么-O去gcc导致“stat”解决?

所以我尝试在调用stat()的文件上调用g ++时将-O添加到我的makefile中。 这似乎解决了这个问题。 我可能对parsing符号不够了解; 然而,这对我来说似乎有些不可思议。 我在那里的基地? 如果没有,解决新系统加载时间错误的正确方法是什么?

Solutions Collecting From Web of "移动到不同的Linux构build系统,出现错误:undefined symbol:stat"

你面临的问题很可能是用ld构建共享库的结果。 UNIX系统上的用户级代码不应该直接使用ld 。 你应该使用编译器驱动程序(在你的情况下g++ )来执行链接。

例:

 // tc #include <sys/stat.h> void fn(const char *p) { struct stat st; stat(p, &st); } gcc -fPIC -c tc ld -shared -o t.so to nm t.so | grep stat U stat ## problem: this library is not linked correctly 

与正确链接的库比较:

 gcc -shared -o t.so to nm t.so | grep stat 0000000000000700 t stat 0000000000000700 t __stat U __xstat@@GLIBC_2.2.5 

要找到上面的本地stat符号来自哪里,你可以这样做:

 gcc -shared -o t.so to -Wl,-y,stat to: reference to stat /usr/lib/x86_64-linux-gnu/libc_nonshared.a(stat.oS): definition of stat 

最后, U stat消失的原因是:

 gcc -E tc | grep -A2 ' stat ' extern int stat (const char *__restrict __file, struct stat *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))); gcc -E tc -O | grep -A2 ' stat ' __attribute__ ((__nothrow__ , __leaf__)) stat (const char *__path, struct stat *__statbuf) { return __xstat (1, __path, __statbuf); 

这是正确的:你得到不同的预处理源取决于优化水平。