我试图在应用程序中包含操作系统的引用,但不包含代码,因为代码已在内存中。有没有办法只将引用(例如os_syscall_reboot ias位于0xda0e)包含在nasm中?
答案 0 :(得分:0)
os_syscall_reboot equ 0xda0e
定义一个汇编时间常数将以某种使用它的方式工作,在某些情况下包括call os_syscall_reboot
。
与nasm -felf32
一起使用,并与ld
链接到静态ELF可执行文件:
os_syscall_reboot equ 0xda0e
call os_syscall_reboot
+ nasm -felf32 -Worphan-labels foo.asm
+ ld -melf_i386 -o foo foo.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008049000
foo: file format elf32-i386
Disassembly of section .text:
08049000 <__bss_start-0x1000>:
8049000: e8 09 4a fc f7 call da0e <os_syscall_reboot>
(我很惊讶os_syscall_reboot
像符号名objdump -drwC -Mintel
一样变成可执行文件。我只将其定义为带有equ的汇编时间常数,而不是org
+标签或其他任何东西。)
但是使用nasm -felf64
,它使用0xda0e-5作为rel32偏移而不是绝对目标进行了组装。(NASM版本2.14.02,在x86-64 Arch GNU上) / Linux)。即它跳到$ + 0xda0e
,这真是太奇怪了。
...
401000: e8 0a da 00 00 call 40ea0f <__bss_start+0xca0f>
YASM -felf64
会按预期组装。
401000: e8 09 ca c0 ff call da0e <__bss_start-0x3f45f2>