【发布时间】:2022-02-13 23:47:34
【问题描述】:
我正在反汇编 elf 可执行文件并了解 elf 格式。在那里,我看到lib64/ld-linux-x86-64.so.2 在生成的可执行文件中用作程序解释器。
我的猜测是:我在源代码中使用了printf,它必须是动态链接的。当我检查动态部分时,我能够找到对libc.so.6 共享库(标签:DT_NEEDED)的引用。在我的系统中,我在不同的目录中发现了多个具有该名称的文件:
sourav@ubuntu-VirtualBox:/$ sudo find / -name libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
find: ‘/run/user/1000/doc’: Permission denied
find: ‘/run/user/1000/gvfs’: Permission denied
/snap/snapd/13170/lib/x86_64-linux-gnu/libc.so.6
/snap/snapd/11107/lib/x86_64-linux-gnu/libc.so.6
/snap/core18/1988/lib/i386-linux-gnu/libc.so.6
/snap/core18/1988/lib/x86_64-linux-gnu/libc.so.6
/snap/core18/2128/lib/i386-linux-gnu/libc.so.6
/snap/core18/2128/lib/x86_64-linux-gnu/libc.so.6
所以,我猜程序解释器的目的是将这些名称解析为适当的库并在执行期间加载它们。这是正确的吗?
看来,我们也可以有没有程序解释器的可执行文件(程序解释器本身就是这种情况)。在那种情况下,系统/操作系统本身是否会加载共享库?如果是,如何解析库的路径?
是否可以使用 gcc 在没有程序解释器的情况下生成可执行文件?我的 gcc 版本是 'gcc 版本 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)'。
【问题讨论】:
标签: linux gcc reverse-engineering elf