【问题标题】:libgcc_s.so: undefined reference to `__stack_chk_fail@GLIBC_2.4'libgcc_s.so:未定义对 `__stack_chk_fail@GLIBC_2.4' 的引用
【发布时间】:2011-07-02 17:31:41
【问题描述】:

一开始我警告说我不是程序员,只是管理员我试图理解一些操作

当我安装 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)如果所有符号都在共享库中,我不知道为什么会出现这个问题(可能不是,请纠正我,或者如何检查)

当我放置没有符号 __stack_chk_fail 的旧库 libgcc_s.so.1 时

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

一切正常

2) 链接器是否不检查对 __stack_chk_fail 的引用,因为在这种情况下 libgcc_s.so.1 内部没有?

【问题讨论】:

    标签: c++ c oracle linker linker-errors


    【解决方案1】:

    问题是:

    libgcc_s.so 依赖于 libc.so.6。这个问题从 glibc 2.4 版本开始。

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

    这个问题将为您提供更多信息。 In Linux stubs are used for standard libraries. Why are stubs required?

    【讨论】:

    • 比我的答案好多了! +1
    • 那么我应该在哪里添加 -lc 在开头或结尾?
    • 在链接行中的lgcc_s之后添加lc。
    • 我担心由于Oracle的安装脚本非常复杂,我不知道我应该把lc放在哪一个。我尝试设置 LD_PRELOAD 但由于安全原因无法设置,接下来我将 LD_LIBRARY_PATH 设置为 /lib 但它不起作用。所以我不明白链接器是否可以从 /lib 路径找到 libgcc_so.1 为什么它在同一目录中找不到 glibc?
    【解决方案2】:

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

    【讨论】:

    • 你能解释一下它应该在哪里定义,因为当执行失败时:objdump -T /lib/libgcc_s.so.1 |grep UND,我得到更多,比如:00000000 DF UND 00000000 GLIBC_2.0 重新分配
    • 当然符号 __stack_chk_fail 在 libgcc_so.1 中未定义,但它在 libc.so.6 中定义,所以我不明白为什么会出现警告
    猜你喜欢
    • 2011-05-28
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多