如何使用 GNU GAS 汇编器生成像 nasm -f bin 这样的普通二进制文件?
我有一些 NASM 文件,通常具有以下结构:
[BITS 64]
[ORG 0x0000000000200000]
start:
...
ret
我像这样组装它们:
nasm -f bin abc.asm
我想使用 GAS 来编写其中一些文件。两个问题:
我应该在 GAS 中使用哪些指令?我找到了“.org”指令,但 GAS 似乎没有“.bits”指令。
我应该将什么传递给
gcc
或as
来生成纯二进制文件?即-f bin
选项对 NASM 的作用。
I have some NASM files that generally have the structure:
[BITS 64]
[ORG 0x0000000000200000]
start:
...
ret
I'm assembling them like so:
nasm -f bin abc.asm
I'd like to write some of these using GAS instead. Two questions:
What directives should I use in GAS? I've found the '.org' directive but GAS doesn't seem to have a '.bits' directive.
What should I pass to
gcc
oras
to generate a plain binary file? I.e. what the-f bin
option does with NASM.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的汇编器默认为 64 位,您可以在命令行上使用
--32
或--64
进行选择。请查看 as 的手册,了解如何更改代码内的架构,如果需要(例如.code16
可用于为引导加载程序生成实模式代码)。您很可能不想使用
.org
指令来指定代码所在的位置,但可能希望使用链接脚本或指定在命令上加载文本和数据段的位置线。 (org 0x0000000000200000
生成 2+ MB 的二进制文件)。<代码>
The assembler defaults to 64--bit for me, you can use
--32
or--64
to chose on the command line. Have a look at the manual for as to see how you can change the architecture inside the code if needed (e.g..code16
can be used to generate real mode code for a boot loader).You most likely don't want to use the
.org
directive to specify where the code is located, but will probably want to use a link script or specify where the text and data segments are loaded on the command line. (org 0x0000000000200000
results in a 2+ MB binary file).objcopy -O binary
一个不错的选择是:
相对于
ld --oformat binary
的优点是使用符号进行调试更容易:另请参阅:https://stackoverflow.com/a/32960272/895245
链接器script
-Ttext
适合快速和肮脏的测试,但对于严肃的工作,您应该使用脚本来提高鲁棒性。否则,
ld
将使用用于用户态应用程序的默认脚本 (ld --verbose
),该脚本与您的应用程序不同。如果没有更多信息,我可以提供的最小脚本是:
然后将其与
-T
一起使用:但是您可能希望根据您的具体应用程序修改该脚本。
另请参阅: 有没有办法获取 gcc输出原始二进制文件?
我有一个存储库,其中包含一些常见用例的工作示例:
objcopy -O binary
A good option is:
The advantage over
ld --oformat binary
is that it is easier to use the symbols to debug via:See also: https://stackoverflow.com/a/32960272/895245
Linker script
-Ttext
is fine for quick and dirty testing, but for serious work you should use a script instead to increase robustness.Otherwise,
ld
will use a default script (ld --verbose
) intended for userland application, which does not look like your application.Without further information, the minimal script I can give is:
And then use it with
-T
:But you will likely want to modify that script based on your exact application.
See also: Is there a way to get gcc to output raw binary?
I have a repository with working examples for some common use cases: