我在纯x86汇编代码中有一个简单的Hello World程序,我编译并链接到 nasm 和 ld 。我遇到的问题是我无法让 DWARF 调试工作。我正在使用Mingw64的 gdb (i686-posix-dwarf-rev1)。如果我使用 gcc 链接而不是ld,则会出现同样的问题。但是,程序构建正常,如果我使用 STABS 调试,那么一切都很好,花花公子。
编辑:哎呀,我完全忘记了 gdb 显示的错误。
...Dwarf Error: bad offset (0x407000) in compilation unit header (offset 0x0
+ 6) [in module C:\Projects\AsmProjects\HelloWorldWin32\bin\x86\hello32.exe]
(no debugging symbols found)...done
每个程序的版本是:
gdb 7.10.1
nasm 2.12.02
ld 2.25
gcc 6.2.0
这些是我发送给nasm的标志:-f elf32 -Fdwarf -g
这些是gcc链接的标志:-o $(BDIR)/x86/$@.exe $^ -L$(Mingw64-x86libs) -lkernel32 -luser32
这些来自ld link:
-mi386pe -o $(BDIR)/x86/$@.exe $^ -L$(Mingw64-x86libs) -lkernel32 -luser32
我有一个非常大的makefile,所以我试图提供绝对必要的最少信息。
以下是该计划的源代码:
global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .text
_main:
push ebp
mov ebp,esp
; GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
push esp
push message_end
push message
push ebx
call _WriteFile@20
; ExitProcess(0)
push 0
call _ExitProcess@4
section .data
message db 'Hello, World',10
message_end equ $ - message
答案 0 :(得分:2)
这不是一个正确的答案,但对于评论部分来说太长了。
我在Ubuntu上编译然后运行dwarfdump
它给出了一个可能与偏移误差有关的错误。
dwarfdump ERROR: dwarf_get_globals: DW_DLE_PUBNAMES_VERSION_ERROR (123)
从LLVM上的similar错误,我得出结论,矮人版本信息可能已损坏或不受支持。
此post表示矮人信息对正确的部分名称敏感。但是,该示例似乎具有正确的部分名称。
您是否尝试过64位版本?也许会出现一条线索。
这个程序看起来工作得很好Ubuntu。你能在Mingw64上试试吗?
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string