[英]Is there a symbol that represents the current address in GNU GAS assembly?
[英]Master Boot Record using GNU Assembly: extra bytes in flat binary output
我正在尝试编译以下简单的 MBR:
.code16
.globl _start
.text
_start:
end:
jmp end
; Don't bother with 0xAA55 yet
我运行以下命令:
> as --32 -o boot.o boot.s
> ld -m elf_i386 boot.o --oformat=binary -o mbr -Ttext 0x7c00
但是,我得到一个超过 129MB 的二进制文件,这对我来说很奇怪。 因此,我想知道构建过程中发生了什么? 非常感谢你。
在 boot.o 上运行 objdump 给我:
> objdump -s boot.o
boot.o: format de fichier elf32-i386
Contenu de la section .text :
0000 ebfe ..
Contenu de la section .note.gnu.property :
0000 04000000 18000000 05000000 474e5500 ............GNU.
0010 020001c0 04000000 00000000 010001c0 ................
0020 04000000 01000000
在调用 ld 之前手动删除部分.note.gnu.property似乎可以解决问题。 但是,我不知道为什么默认情况下会出现此部分......运行以下构建命令似乎也可以解决问题:
> as --32 -o boot.o boot.s -mx86-used-note=no
> ld -m elf_i386 boot.o --oformat=binary -o mbr -Ttext 0x7c00
将-mx86-used-note=no
标志与 as 一起使用将删除注释部分。 在这里查看https://sourceware.org/binutils/docs/as/i386_002dOptions.html
-mx86-used-note=no
-mx86-used-note=yes
这些选项控制汇编程序是否应生成 GNU_PROPERTY_X86_ISA_1_USED 和 GNU_PROPERTY_X86_FEATURE_2_USED GNU 属性注释。 默认值可以由 --enable-x86-used-note 配置选项控制。
ld
将您的所有部分链接到平面二进制文件 output 中,除非您告诉它不要这样做(例如使用 linker 脚本)。
额外的字节来自.note.gnu.property
部分, as
添加,它可以指示诸如 x86 ISA 版本之类的东西(例如 AVX2+FMA+BMI2,Haswell 功能级别,是 x86-64_v3。)你不希望在您的平面二进制文件,尤其是在远离您告诉它使用-Ttext
放置.text
部分的位置的默认高地址处; 这将导致一个巨大的文件,因为它是一个平面二进制文件,所以用零填充间隙。
使用as -mx86-used-note=no
将首先从.o
中省略该部分,只留下您在 asm 源代码中定义的部分。 来自GAS 手册的 i386 选项
-mx86-used-note=no
-mx86-used-note=yes
这些选项控制汇编程序是否应生成 GNU_PROPERTY_X86_ISA_1_USED 和 GNU_PROPERTY_X86_FEATURE_2_USED GNU 属性注释。 默认值可以由 --enable-x86-used-note 配置选项控制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.