2017-01-25 69 views
5

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

, ben ld 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 jessieaynı 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

+1

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? –

+0

@JimD. yardımın için çok teşekkürler. Yeni hata mesajını göstermek için gönderimi düzenledim. –

+2

"gcc -static hello.o" –

cevap

6

GCC ile çözüldü GCC'ye.

Alternatif olarak doğru yer değiştirme türünü belirtin, bunu yasm'da nasıl yapacağımı bilmiyorum.

+0

Merhaba Timothy, bağlama komutu' gcc -fno-pasta hello.o' benim 'Debian stretch' makinede başarısız olur. Neyi kaçırıyorum? –

+0

Maalesef, bağlantı kurulduğunda '-no-pie 'olmalı,' -fno-pie 'derlemeyi kontrol eder. –

+0

Teşekkür ederim Timothy, hem de 'gcc -static hello.o' hem de 'gcc -no-pie hello.o' mükemmel çalışıyor! –