Maalesef sorunumu tam olarak çözemediğim this thread numaralı telefonu takip etmeye çalışıyorum.X86 64 bit Montaj Linux 'Merhaba Dünya' bağlantı sorunu
$ uname -a
Linux <host> 4.8.0-1-amd64 #1 SMP Debian 4.8.7-1 (2016-11-13) x86_64 GNU/Linux
şöyle ben yasm
assembler kullanıyorum:
; File hello.asm
section .data
msg: db "Hello World!",0x0a,0
section .text
global main
extern printf
main:
push rbp
mov rbp, rsp
lea rdi, [msg] ; parameter 1 for printf
xor eax, eax ; 0 floating point parameter
call printf
xor eax, eax ; returns 0
pop rbp
ret
Benim sistem debian germek şu şekildedir: Ben çalıştırmak çalışıyorum kodudur
$ yasm -f elf64 -g dwarf2 hello.asm
Çünkü benim giriş Yukarıdaki kaynak noktası main
bir son ret
talimatı ile, benyerine gcc
ile bağlantı gerektiğini tahmin ediyorum:
/usr/bin/ld: hello.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Bu hata -fPIC
ile yeniden derlenmesine ilgili bir şeyler bahseder ama bu assembler yasm
geçerli bir seçenek gcc
derleyici seçeneği değildir: Ancak
$ gcc -lc hello.o
, aşağıdaki hata iletisi alıyorum . Yani burada ne yapacağımı bilmiyorum. Sadece test uğruna
, benld
ile bağlantı kurmak çalıştılar:
$ ./a.out
bash: ./a.out: No such file or directory # The file *is* there ...
: başarılıdır, ancak yukarıdaki iplik belirtilen çalıştırırken aynı hatayı elde
$ ld -e main -lc hello.o
(İş parçacığının yanıtını takip ederek, ld
ikili dosyasında sistemimdeki kütüphaneyle belirtilen .so
kütüphanesini karşılaştırmaya çalıştım ve ikisi de /lib64/ld-linux-x86-64.so.2
.)
Ben de ld -lc hello.o
ile ve bağlantı (düzgün şimdilik programdan çıkmadan konusunu unutmadan) _start
ile main
giriş noktası yerine çalıştılar ama aynı hatayı daha önce olduğu gibi 'Böyle bir dosya veya dizin' olsun. Bununla oynamaya devam edeceğim, ama ben de isteyeceğimi düşündüm. (main
veya _start
, gcc
veya ld
) ile
herhangi bir işçilik öneri sıcak takdir.
DÜZENLEME: Jim önerdiği gibi Ben hello.asm
üstündeki default rel
ekledik ve gcc (ld -e main -lc
ile hiçbir değişiklik) ile bağlarken ben farklı bir hata mesajı elde
$ gcc -lc hello.o
/usr/bin/ld: hello.o: relocation R_X86_64_PC32 against symbol `[email protected]@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
EDIT2: Bu yayın debian stretch
bir başarısızlık ilişkindir:
Linux: 4.8.0-1-amd64 #1 SMP Debian 4.8.7-1 (2016-11-13) x86_64 GNU/Linux
yasm: 1.3.0
gcc: (Debian 6.2.1-5) 6.2.1 20161124
ld: GNU ld (GNU Binutils for Debian) 2.27.51.20161220
followi ng Jim'in comment üzerinde sadece gcc -lc hello.o
ile mükemmel çalışıyordebian jessie
aynı kodu test edilmiş ve aşağıdaki versiyonları var: Michael Petch gelen resmi bir cevap bekleyen:
Linux: 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
yasm: 1.2.0
gcc: (Debian 4.9.2-10) 4.9.2
ld: GNU ld (GNU Binutils for Debian) 2.25
DÜZENLEME 3 sorunu geleneksel geçişolduğu gibi belirli bir adrese bağlı yürütülebilir oluşturmak için Debian Stretch defaults to building position independent executables içindegcc -static hello.o
Kodunuz aslında benim için çalışır (farklı bir dağıtımda). Sorununuz 'hello.o' yer değiştirme türü ile ilgili gibi görünüyor. "Default rel" yönergesini "hello.asm" nin üstüne eklemenizi öneririm ve bunun çalışıp çalışmadığını veya farklı bir hata sağladığını görürsünüz. Kasıtlı olarak R_X86_64_32 yeniden yerleştirmeyi mi kullanıyorsunuz? –
@JimD. yardımın için çok teşekkürler. Yeni hata mesajını göstermek için gönderimi düzenledim. –
"gcc -static hello.o" –