我想了解 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.
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 的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句