【问题标题】:Why does a shared object fail if it has extra symbols compared to the original如果共享对象与原始对象相比具有额外的符号,为什么它会失败
【发布时间】:2011-08-06 05:11:19
【问题描述】:

我有一个剥离的 ld.so 我想用未剥离的版本替换(以便 valgrind 工作)。我已确保我拥有相同版本的 glib 和交叉编译器。

我已经编译了共享对象,在其上调用“文件”表明它已正确编译(与原始文件的唯一区别是“未剥离”并且大约大 15%)。不幸的是,它会在启动时导致内核恐慌(无法初始化)。剥离新编译的 .so ,对其进行重新编译并与原始文件进行比较,表明新版本的 .so 中有额外的符号。所有旧符号仍然存在,所以我不明白为什么内核会因为那里的那些额外符号而恐慌。

我希望额外的符号对内核启动没有影响,因为它们永远不应该被调用,那么为什么会出现内核恐慌?

注意:要明确一点 - 我仍然需要调查为什么会有额外的符号,但我的问题是为什么这些未使用的符号会导致问题。

【问题讨论】:

    标签: shared-libraries embedded-linux glibc


    【解决方案1】:

    内核(假设是 Linux)不以任何方式、形状或形式依赖或使用 ld.so。它发生恐慌的原因很可能是它无法执行任何使用ld.so 的用户级程序(例如/bin/init 和/bin/sh)。

    至于为什么你的init 不喜欢你的新ld.so,很难说。一个常见的错误是尝试将ld.so 替换为/usr/lib/debug/ld-X.Y.so 的内容。虽然那个文件看起来和原来的/lib/ld-X.Y.so没有太大区别,但实际上非常不同,不能用来替换原来的,只能调试原来的(/usr/lib/debug/ld-X.Y.so通常只包含调试部分,但不包含 /lib/ld-X.Y.so 的代码和数据部分,因此尝试运行它通常会立即导致 SIGSEGV)。

    也许您可以设置一个chroot,模仿您的嵌入式环境,并在其中运行/bin/ls?这将产生的错误(或核心转储)可能会告诉您您的ld.so 有什么问题。

    【讨论】:

    • 嗯,我想我犯了这个常见的错误。我将尝试使用 chroot 选项来确定问题的根本原因是什么。
    • 有什么更新吗?我正在处理一个稍微相关的问题,想知道它的进展情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2011-04-25
    • 2020-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多