Как разрешить попытку объявить локальный символ глобальным при компиляции сборки NASM, сгенерированной из файла C ++ на Windows 10? - PullRequest
0 голосов
/ 15 января 2020

Я новичок в сборке и пытаюсь скомпилировать файл asm, сгенерированный из файла c ++, следуя этому руководству Как сгенерировать ассемблируемый в nasm код сборки из c исходного кода на Linux?,

Код c ++:

#include <iostream>

int main () {
std::cout << "Hello World!";
return 0;
}

После устранения некоторых ошибок, следующих за руководством, у меня осталось "hw.asm: 8: error: попытка объявить локальный символ` .refptr ._ZSt4cout 'как глобальный. " Я попытался удалить глобальный ярлык для значения и переместить его в раздел .text или section .data, но ни один из них не сработал. Asm

; Disassembly of file: hw.o
; Tue Jan 14 19:14:41 2020
; Mode: 64 bits
; Syntax: YASM/NASM
; Instruction set: Pentium Pro, x64

global main
global .refptr._ZSt4cout

extern _ZSt4cout                                        ; byte
extern atexit                                           ; near
extern _ZNSt8ios_base4InitC1Ev                          ; near
extern _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc ; near
extern _ZNSt8ios_base4InitD1Ev                          ; near
extern __main                                           ; near


SECTION .text                           ; section number 1, code


__tcf_0:lea     rcx, [rel _ZStL8__ioinit]               ; 0000 _ 48: 8D. 0D, 00000000(rel)
        jmp     _ZNSt8ios_base4InitD1Ev                 ; 0007 _ E9, 00000000(rel)

        nop                                             ; 000C _ 90
        nop                                             ; 000D _ 90
        nop                                             ; 000E _ 90
        nop                                             ; 000F _ 90


SECTION .data                         ; section number 2, data


SECTION .bss                          ; section number 3, bss

_ZStL8__ioinit:                                         ; byte
        resb    16                                      ; 0000


SECTION .rdata                        ; section number 4, const

?_001:                                                  ; byte
        db 48H, 65H, 6CH, 6CH, 6FH, 20H, 77H, 6FH       ; 0000 _ Hello wo
        db 72H, 6CH, 64H, 21H, 00H, 00H, 00H, 00H       ; 0008 _ rld!....


SECTION .text.startup                   ; section number 5, code

.text.startup:; Local function
.refptr._ZSt4cout
main:
        sub     rsp, 40                                 ; 0000 _ 48: 83. EC, 28
        call    __main                                  ; 0004 _ E8, 00000000(rel)
        mov     rcx, qword [rel .refptr._ZSt4cout]      ; 0009 _ 48: 8B. 0D, 00000000(rel)
        lea     rdx, [rel ?_001]                        ; 0010 _ 48: 8D. 15, 00000000(rel)
        call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc; 0017 _ E8, 00000000(rel)
        xor     eax, eax                                ; 001C _ 31. C0
        add     rsp, 40                                 ; 001E _ 48: 83. C4, 28
        ret                                             ; 0022 _ C3

; Filling space: 0DH
; Filler type: Multi-byte NOP
;       db 0FH, 1FH, 00H, 66H, 2EH, 0FH, 1FH, 84H
;       db 00H, 00H, 00H, 00H, 00H

ALIGN   16

_GLOBAL__sub_I_main:; Local function
        lea     rcx, [rel _ZStL8__ioinit]               ; 0030 _ 48: 8D. 0D, 00000000(rel)
        sub     rsp, 40                                 ; 0037 _ 48: 83. EC, 28
        call    _ZNSt8ios_base4InitC1Ev                 ; 003B _ E8, 00000000(rel)
        lea     rcx, [rel __tcf_0]                      ; 0040 _ 48: 8D. 0D, 00000000(rel)
        add     rsp, 40                                 ; 0047 _ 48: 83. C4, 28
        jmp     atexit                                  ; 004B _ E9, 00000000(rel)


SECTION .ctors                         ; section number 6, data

        dq _GLOBAL__sub_I_main                          ; 0000 _ 0000000000000030 (d)


SECTION .rdata$zzz                    ; section number 7, const

        db 47H, 43H, 43H, 3AH, 20H, 28H, 78H, 38H       ; 0000 _ GCC: (x8
        db 36H, 5FH, 36H, 34H, 2DH, 70H, 6FH, 73H       ; 0008 _ 6_64-pos
        db 69H, 78H, 2DH, 73H, 65H, 68H, 2DH, 72H       ; 0010 _ ix-seh-r
        db 65H, 76H, 31H, 2CH, 20H, 42H, 75H, 69H       ; 0018 _ ev1, Bui
        db 6CH, 74H, 20H, 62H, 79H, 20H, 4DH, 69H       ; 0020 _ lt by Mi
        db 6EH, 47H, 57H, 2DH, 57H, 36H, 34H, 20H       ; 0028 _ nGW-W64 
        db 70H, 72H, 6FH, 6AH, 65H, 63H, 74H, 29H       ; 0030 _ project)
        db 20H, 36H, 2EH, 33H, 2EH, 30H, 00H, 00H       ; 0038 _  6.3.0..


SECTION .rdata$.refptr._ZSt4cout      ; section number 8, const
;  Communal section not supported by YASM

.refptr._ZSt4cout:                                      ; qword
        dq _ZSt4cout                                    ; 0000 _ 0000000000000000 (d)
        dq 0000000000000000H                            ; 0008 _ 0000000000000000 

Я понимаю, что говорит ошибка, но не совсем уверен, как ее исправить. У меня не было опыта работы с языком ассемблера, и не повезло найти ответ в Интернете. Буду очень признателен за шаг в правильном направлении.

Также я делаю это на Windows 10, используя mingw и ebe ide.

...