我有一个剥离的ld.so,我想用未剥离的版本替换(以便valgrind工作)。我确保我有相同版本的glib和交叉编译器。
我已经编译了共享对象,在它上面调用'file'表明它被正确编译了(唯一的区别是原来是'unstripped'并且大约增加了15%)。不幸的是,它会在启动时导致内核崩溃(无法初始化)。剥离新编译的.so,对其进行重新分析并使用原始文件进行区分,表明新版本的.so中有额外的符号。所有旧的符号仍然存在,所以我不明白为什么内核会在那里出现那些额外的符号。
我希望额外的符号对内核启动没有影响,因为它们永远不会被调用,所以为什么我会遇到内核恐慌?
注意:要明确 - 我仍然需要调查为什么有额外的符号,但我的问题是为什么这些未使用的符号会导致问题。
答案 0 :(得分:1)
内核(假设Linux)不依赖于或以任何方式,形状或形式使用ld.so
。恐慌的原因很可能是它不能执行使用/bin/init
的任何用户级程序(例如/bin/sh
和ld.so
)。
至于为什么你的init
不喜欢你的新ld.so
,这很难说。一个常见错误是尝试将ld.so
替换为/usr/lib/debug/ld-X.Y.so
的内容。虽然该文件看起来与原始/lib/ld-X.Y.so
没有太大差别,但实际上非常不同,并且不能用于替换原始文件,只能调试原始文件({ {1}}通常只包含调试部分,但/usr/lib/debug/ld-X.Y.so
的代码和数据部分都没有,因此尝试运行它通常会导致/lib/ld-X.Y.so
}。
也许您可以设置SIGSEGV
,模仿您的嵌入式环境,并在其中运行chroot
?这将产生的错误(或核心转储)可能会告诉您/bin/ls
的错误。