2011-02-23 68 views
4

起初我还警告说,I/M不是程序员,但管理员只有我试着去了解一些动作libgcc_s.so:未定义的引用`[email protected]_2.4'

当我安装了Oracle提出的程序,我得到了日志消息:

/usr/bin/make -f ins_precomp.mk relink ORACLE_HOME=/u01/oracle/OraHome_1 EXENAME=proc/Linking /u01/oracle/OraHome_1/precomp/lib/proc
libgcc_s.so: undefined reference to
__stack_chk_fail @ GLIBC_2.4'`

ls -l
../libgcc_s.so -> /lib/libgcc_s.so.1

所以下次我试图诊断:

objdump -T /lib/libgcc_s.so.1 | grep的__stack_chk_fail
00000000 DF *UND* 00000000 GLIBC_2.4 __stack_chk_fail

LDD /lib/libgcc_s.so.1.ORG
linux-gate.so.1 => (0x00fc5000)
libc.so.6 => /lib/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00b39000)

objdump的-T/lib中/libc.so.6 | grep __ stack_chk_fail
00c52f80 g DF .text 0000001a GLIBC_2.4 __stack_chk_fail

1)我不知道为什么这个问题会发生,如果所有的符号里面共享库(mabye没有,请大家指正,或如何检查)

当我把旧的图书馆libgcc_s.so.1无符号__stack_chk_fail

objdump的-T /lib/libgcc_s.so.1 | grep的__stack_chk_fail
empty output

一切正常

2)不要连接不检查参照__stack_chk_fail,因为没有在这种情况下,里面libgcc_s.so.1?

回答

2

*UND* in 00000000 DF *UND* 00000000 GLIBC_2.4 __stack_chk_fail表示该部分被引用但未定义。所以是的,你错过了这个符号。

+0

你能解释一下它应该被定义在什么地方吗?因为当执行失败时如此:objdump -T /lib/libgcc_s.so.1 | grep UND,我获得更多,例如:00000000 DF * UND * 00000000 GLIBC_2。 0 realloc – martin 2011-02-23 13:14:20

+0

当然符号__stack_chk_fail在libgcc_so.1中未定义,但是它在libc.so.6中定义,所以我不明白为什么会发生警告 – martin 2011-02-24 21:50:40

4

的问题是:

libgcc_s.so正在对libc.so.6的依赖性。这个问题始于glibc 2.4版本。

您应该在链接行中添加-lc。

这个问题会给你更多的信息。 In Linux stubs are used for standard libraries. Why are stubs required?

+0

比我的答案要好得多!+1 – 2011-02-23 12:33:48

+0

所以我应该在开始或结束时添加-lc? – martin 2011-02-23 13:39:10

+0

在链接行中添加lccc_s之后的lc。 – sunmoon 2011-02-23 16:48:19