Problem
Verknüpfung Wenn ich meinen Assembler-Code mit as
(binutils) und Link mithilfe link.exe (Visual Studio 2015) stürzt das Programm wegen eines unrelocated Adresse kompilieren.Unrelocated Adresse, wenn sie mit link.exe
Bei der Verknüpfung mit gcc (gcc hello-64-gas.obj -o hello-64-gas.exe
) läuft das Programm korrekt ohne Absturz obwohl. Gehe ich richtig davon aus, dass die Objektdatei, die von as
erzeugt wird, compilerunabhängig sein sollte, da sich Abi-Kompatibilitätsprobleme in den Händen des Assembly-Code-Schreibers befinden? Da ich ein Anfänger bin, wird jede Erklärung meiner Fehler/falschen Annahmen geschätzt.
Plattform
- 10 Windows 64-Bit-
- Linker: Visual Studio 2015 die nativen Befehl Tools-Eingabeaufforderung (x64)
- Compiler mit:
as
von MinGW-w64
Beispiel
Der folgende Code tut nicht Link richtig:
# hello-64-gas.asm print a string using printf
# Assemble: as hello-64-gas.asm -o hello-64-gas.obj --64
# Link: link -subsystem:CONSOLE hello-64-gas.obj -out:hello-64-gas.exe libcmt.lib libvcruntime.lib libucrt.lib legacy_stdio_definitions.lib
.intel_syntax noprefix
.global main
# Declare needed C functions
.extern printf
.section .data
msg: .asciz "Hello world"
fmt: .asciz "%s(%d; %f)\n"
myDouble: .double 2.33, -1.0
.text
main:
sub rsp, 8*5
mov rcx, offset flat: fmt
mov rdx, offset flat: msg
mov r8, 0xFF
mov r9, offset flat: myDouble
mov r9, [r9]
movq xmm4, r9
call printf
add rsp, 8*5
mov rax, 0
ret
Beim Debuggen es scheint mov r9, offset flat: myDouble
nicht verlegt: mov r9,18h
, wo 18h
würde, wenn die .data
wo an der Position Null korrekt sein. Mit Blick auf die Verschiebungstabelle mit objdump -dr hello-64-gas.obj
ergibt:
...
19: 49 c7 c1 18 00 00 00 mov $0x18,%r9
1c: R_X86_64_32S .data
...
Variation (? Abhilfe)
Ersetzen mov
mit movabs
scheint zu funktionieren:
# hello-64-gas.asm print a string using printf
# Assemble: as hello-64-gas.asm -o hello-64-gas.obj --64
# Link: link -subsystem:CONSOLE hello-64-gas.obj -out:hello-64-gas.exe libcmt.lib libvcruntime.lib libucrt.lib legacy_stdio_definitions.lib
.intel_syntax noprefix
.global main
# Declare needed C functions
.extern printf
.section .data
msg: .asciz "Hello world"
fmt: .asciz "%s(%d; %f)\n"
myDouble: .double 2.33, -1.0
.text
main:
sub rsp, 8*5
movabs rcx, offset flat: fmt
movabs rdx, offset flat: msg
mov r8, 0xFF
movabs r9, offset flat: myDouble
mov r9, [r9]
movq xmm4, r9
call printf
add rsp, 8*5
mov rax, 0
ret
Dies irgendwie richtig läuft bei Verwendung von link.exe
verknüpft.
Die dümmsten keine Forschungsfragen sind upvoted, aber wenn jemand tatsächlich versucht zu debuggen und sonst die Ursache des Problems zu finden, gibt die richtigen Details in einer gut formatierten Frage mit korrekten Tags und sogar einen Workaround, dann ist er downvoted? Ich verstehe diese Welt nicht mehr. – Jester
@Jester, ich habe gerade uplooted ;-) aber ja, muss zugeben, das ist eine viel bessere Frage als das, was wir normalerweise sehen! –