Jus*_*tin 6 assembly linker nasm ld
我正在创建自己的"玩具"操作系统,我已经到了我试图理解链接和可执行格式的地步 - 特别是我有一个平面文件二进制格式可执行文件,我将其加载到内存中的地址0x500然后直接打电话.作为一个例子考虑以下两个指令(我知道它的设计,我只想在我的样本中包括a call和mov)
mov ax, some_label
call some_label
; some_label is at address 0x99 into the resulting binary
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直使用NASM通过org 0x500命令使用指令来产生所需的输出nasm -f bin myfile.asm.生成的反汇编看起来像这样并且完美地运行:
mov ax, 0x599
call 0x599
Run Code Online (Sandbox Code Playgroud)
我现在想开始使用LD,以便我可以链接其他对象,但经过大量的实验和阅读后,我仍然不明白为什么能够获得可靠的结果.
我收集的比为了产生类似的输出我需要:
.textsection 的地址相关联0x500,然后将结果作为平面二进制文件发出 - 链接器最终决定在最终二进制文件中解析各种偏移量.到目前为止,我已经尝试了以下内容:
:: Output as ELF
nasm -f elf myfile.asm
:: Then link and output as binary with the address of .text as 0x500
ld --oformat binary -Ttext 0x500 myfile.o
Run Code Online (Sandbox Code Playgroud)
但是这给了我以下错误(这是在Mingw上):
ld:不能对非PE输出文件进行PE操作
谷歌搜索引导我到这个邮件列表,这似乎是有道理的,所以我尝试了以下:
:: Output as ELF
nasm -f elf myfile.asm -o myfile.o
:: Link using LD
ld myfile.o -Ttext 0x500 -s -o myfile.tmp
:: Use objdump to output as a flat binary
objcopy -O binary myfile.tmp myfile
Run Code Online (Sandbox Code Playgroud)
然而,结果myfile看起来像垃圾:
00000000 66B8C105E8B8 mov eax,0xb8e805c1
00000006 0000 add [bx+si],al
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上面的一些变化,但没有一个产生我期待的东西,所以现在我很困惑:
所以我发现我做了很多错误的事情,其中最严重的是尝试使用LD(不支持16位代码)编译和链接16位代码,并且没有明确指定代码是16位使用BITS 16(意味着 NASM 发出 32 位内存地址)。
这总体上解释了 LD 在上述情况的某些变体中给我的一些奇怪的错误消息,以及为什么链接的二进制文件的反汇编是垃圾 - 我试图将 32 位代码反编译为 16 位代码或反之亦然。
理想情况下,我希望能够链接 16 位代码,但发现我无法使用 LD 来做到这一点(并且很少有替代方案可以做到这一点),我决定解决当我重复时理解发生了什么32 位代码也是如此。我的输入文件:
; Address locations are now 32 bits so I must use `eax` instead of `ax`
mov eax, some_label
call some_label
; some_label is at a different address into the resulting binary (because
; pointers are wider the resulting machine code is larger)
Run Code Online (Sandbox Code Playgroud)
然后我使用以下链接链接:
:: Output as win32 object files - makes it possible to use -r with LD.
nasm -f win myfile.asm -o myfile.o
:: Link using LD - the -r flag prevents extra un-used code (e.g. __CTOR_LIST__) being generated - see the link in my original question text
ld myfile.o -Ttext 0x500 -s -r -o myfile.tmp
:: Use objdump to output as a flat binary - -j .text ensures that just the .text section is included which keeps the output file size down
objcopy -O binary -j .text myfile.tmp myfile
Run Code Online (Sandbox Code Playgroud)
使用反汇编时,ndisasm我需要指定-b 32才能将代码正确解释为 32 位。
我进行了大量的实验并阅读了晦涩的论坛链接,但结果我现在对整个事情有了更好的理解。
| 归档时间: |
|
| 查看次数: |
5411 次 |
| 最近记录: |