-3

我想了解 Linux 可执行文件是如何组成的。我在哪里可以得到规范?

我用 gcc 编译了一个简单的汇编文件,但生成的文件大小比我预期的要大得多。

# cat tmp.s
.intel_syntax noprefix
.global main
main:
        mov rax, 42
        ret
# gcc -o tmp tmp.s
# ./tmp
# echo $?
42

# ls -l tmp
-rwxr-xr-x 1 root root 8136 Jul 31 04:03 tmp

# xxd tmp
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0300 3e00 0100 0000 f004 0000 0000 0000  ..>.............
...
...
00001fb0: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00001fc0: 0000 0000 0000 0000                      ........

# uname -a
Linux fb8275f9e7a0 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4

1 回答 1

2

file tmp会告诉你这是一个ELF 可执行文件。请参阅https://stackoverflow.com/tags/elf/info,然后尝试readelf -a tmp

回复:文件大小:https ://www.muppetlabs.com/~breadbox/software/tiny/teensy.html 。

当前的工具链也将部分与页面边界对齐,使它们比必要的更大。链接以ld --nmagic完全禁用节对齐(可能会破坏编译器生成的代码)。还禁用与共享库的链接。无论如何,这就是为什么您的可执行文件在大部分是填充时才刚刚超过 2x 4kiB。

于 2019-07-31T05:05:19.300 回答