Nasm矮人错误坏偏移

时间:2016-09-15 03:25:35

标签: gcc assembly gdb nasm dwarf

我在纯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

1 个答案:

答案 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