【问题标题】:Executable without dynamic linkker无需动态链接器即可执行
【发布时间】:2020-03-23 15:08:04
【问题描述】:

我可以编译(使用 g++ 编译器)一个可执行文件(在 linux 上)并去掉动态链接器 /lib64/ld-linux-x86-64.so.2 吗? 我的意思是,如果我ldd 构建后的可执行文件应该检测到当前(linux)系统的链接器。

【问题讨论】:

    标签: linux gcc linker g++


    【解决方案1】:

    我可以编译(使用 g++ 编译器)一个可执行文件(在 linux 上)并去掉动态链接器 /lib64/ld-linux-x86-64.so.2 吗?我的意思是,如果我在构建后 ldd 可执行文件,它应该会检测到当前(linux)系统的链接器。

    看来 GNU 链接器选项 --dynamic-linker 完全符合您的要求。

    [ aquila tmp ] $ cat 1.c
    int niam (int a) { return a * (a-1) ; }
    int main(int argc) { return niam (argc) ; }
    [ aquila tmp ] $ cc 1.c
    [ aquila tmp ] $ ./a.out ; echo $?
    0
    [ aquila tmp ] $ ls /tmp/ld.so
    ls: cannot access '/tmp/ld.so': No such file or directory
    [ aquila tmp ] $ cc -Wl,--dynamic-linker,/tmp/ld.so 1.c
    [ aquila tmp ] $ ./a.out
    -bash: ./a.out: No such file or directory
    [ aquila tmp ] $ file ./a.out
    ./a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /tmp/ld.so
    , for GNU/Linux 2.6.32, BuildID[sha1]=e520e119f419bf9b557da6d6b3158bb5ad2195e9, not stripped
    [ aquila tmp ] $ ldd ./a.out
            linux-vdso.so.1 (0x00007ffc775a8000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fa4901c7000)
            /tmp/ld.so => /lib64/ld-linux-x86-64.so.2 (0x0000556ec4bcb000)
    [ aquila tmp ] $ ls -l a.out
    -rwxr-xr-x 1 ranga davfs2 8008 Apr  8 09:53 a.out
    [ aquila tmp ] $ cp /lib64/ld-linux-x86-64.so.2 /tmp/ld.so
    [ aquila tmp ] $ ./a.out
    [ aquila tmp ] $ ldd a.out
            linux-vdso.so.1 (0x00007ffd374a4000)
            libc.so.6 => /lib64/libc.so.6 (0x00007f7e87b9a000)
            /tmp/ld.so => /lib64/ld-linux-x86-64.so.2 (0x00005595b5585000)
    

    我没有/lib64/ld-linux-x86-64.so.2,实际上我没有/lib64 路径。我的链接器存在于另一条路径上。当我想将输出从我的系统传送到具有 /lib64/ld-linux-x86-64.so.2 的系统时,就会出现问题。所以我在想我是否可以去掉动态链接器路径。

    请注意 - 使用--no-dynamic-linker 剥离动态链接器路径(PT_INTERP ELF 程序头)将创建一个无法执行的二进制对象 - 即使链接行中指定的动态链接器路径在链接时无效,链接也成功 - 虽然ldd 显示系统动态链接器,但实际运行可执行文件要求动态链接器准确地存在于指定路径中 - (因此)你需要知道链接时目标系统的动态链接器的路径

    罢工>

    它应该检测当前(linux)系统的链接器。

    那里记录的是动态加载器的路径,这在相互兼容的平台(以及动态加载器的兼容版本)中通常是通用的。因此,它可能有助于准确描述您想要实现的目标以及阻止您实现目标的原因。

    【讨论】:

    • 我没有/lib64/ld-linux-x86-64.so.2,实际上我没有/lib64 路径。我的链接器存在于另一条路径上。当我想将输出从我的系统传递到具有/lib64/ld-linux-x86-64.so.2 的系统时,就会出现问题。所以我在想我是否可以去掉动态链接器路径。
    • 也许您应该阅读ld(1) 手册页;尝试链接器 --dynamic-linker-rpath-rpath-link 选项。我想你必须使用-Xlinkergcc 选项从gcc 命令行将它们传递给链接器。
    猜你喜欢
    • 2020-03-20
    • 2015-12-11
    • 2011-06-07
    • 2016-03-29
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多