为什么ld的输出二进制执行不了?
Why the output binary of ld can not be executed?
(我正在使用 Ubuntu 18.04 x86-64)
这是我程序的两个源文件:
//main.c
#include "stdio.h"
int sum(int *a, int n);
int array[2] = {1, 2};
int main()
{
int val = sum(array,2);
printf("%d\n", val);
return 0;
}
//sum.c
int sum(int *a, int n)
{
int i = 0,s =0;
for(;i<n;i++)
s+=a[i];
return s;
}
我通过以下步骤生成了可执行文件:
# preprocessing
gcc -E main.c -o main.i
gcc -E sum.c -o sum.i
# compilation
gcc -Og -S main.i -o main.s
gcc -Og -S sum.i -o sum.s
# assembling
as main.s -o main.o
as sum.s -o sum.o
# linking
ld -o prog sum.o main.o -lc --entry main
但是prog不能运行:
$ ./prog
-bash: ./prog: No such file or directory
$ file ./prog
prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld6, not stripped
$ stat prog
File: prog
Size: 6424 Blocks: 16 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3153139 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/ u) Gid: ( 1000/ u)
Access: 2021-01-22 17:41:02.516854257 +0800
Modify: 2021-01-22 17:31:02.969230783 +0800
Change: 2021-01-22 17:40:57.432364965 +0800
Birth: -
我想知道是什么问题导致我无法执行该文件。
如果你 运行 ldd prog
你会看到 /lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2
。加载程序 /lib/ld64.so.1
不存在,您收到 No such file or directory
错误。如果将 --dynamic-linker=/lib64/ld-linux-x86-64.so.2
添加到链接选项,则可以执行该程序。另见 答案。
编辑:
执行gcc -v main.c sum.c -o program
可以看到gcc
使用的参数。我使用该输出来查找丢失的链接参数。当与 ld -o prog sum.o main.o -lc --dynamic-linker=/lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/8/crtbeginS.o -lc /usr/lib/gcc/x86_64-linux-gnu/8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crtn.o
链接时,不再有分段。
(我正在使用 Ubuntu 18.04 x86-64)
这是我程序的两个源文件:
//main.c
#include "stdio.h"
int sum(int *a, int n);
int array[2] = {1, 2};
int main()
{
int val = sum(array,2);
printf("%d\n", val);
return 0;
}
//sum.c
int sum(int *a, int n)
{
int i = 0,s =0;
for(;i<n;i++)
s+=a[i];
return s;
}
我通过以下步骤生成了可执行文件:
# preprocessing
gcc -E main.c -o main.i
gcc -E sum.c -o sum.i
# compilation
gcc -Og -S main.i -o main.s
gcc -Og -S sum.i -o sum.s
# assembling
as main.s -o main.o
as sum.s -o sum.o
# linking
ld -o prog sum.o main.o -lc --entry main
但是prog不能运行:
$ ./prog
-bash: ./prog: No such file or directory
$ file ./prog
prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld6, not stripped
$ stat prog
File: prog
Size: 6424 Blocks: 16 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3153139 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/ u) Gid: ( 1000/ u)
Access: 2021-01-22 17:41:02.516854257 +0800
Modify: 2021-01-22 17:31:02.969230783 +0800
Change: 2021-01-22 17:40:57.432364965 +0800
Birth: -
我想知道是什么问题导致我无法执行该文件。
如果你 运行 ldd prog
你会看到 /lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2
。加载程序 /lib/ld64.so.1
不存在,您收到 No such file or directory
错误。如果将 --dynamic-linker=/lib64/ld-linux-x86-64.so.2
添加到链接选项,则可以执行该程序。另见
编辑:
执行gcc -v main.c sum.c -o program
可以看到gcc
使用的参数。我使用该输出来查找丢失的链接参数。当与 ld -o prog sum.o main.o -lc --dynamic-linker=/lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/8/crtbeginS.o -lc /usr/lib/gcc/x86_64-linux-gnu/8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crtn.o
链接时,不再有分段。