Forum: Diğer Konular RSS
Assembly Soru
Avatar
huseyin #1
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Assembly Soru
Merhaba arkadaşlar assembly ile çok ilgili değil aslında sormak istediğim şey bir programın ld tarafından nereden linklendiği tam anlatamadım ama kodda anlayacaksınız

EXTERN    system
EXTERN    puts
EXTERN    getchar
EXTERN     exit
EXTERN    sleep
 
section .text
 
global    _start
_start:    
    PUSHA    
    PUSH    EBP
    MOV    EBP, ESP
    PUSH    String_1
    CALL    puts
    POP    EAX
    PUSH    String_2
    CALL    puts
    POP    EAX
    CALL    getchar
    MOV    ESP, EBP
    POP    EBP
    POPA    
    PUSH    0
    CALL    exit
    
    
    
section .data
 
ClearScreen         db "clear",0
String_1         db "hello world",0
String_2         db "Press ENTER to exit...",0

Nasm de başarıyla derleniyor ancak linkleme işleminde
a.o: In function `_start':
a.asm:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'


hatası var anlayamadığım start ı benim tanımlamam gerekiyor diye biliyorum ama ayrıca main i de tanımlasamda hala referans hatası alıyorum windows altında goLinker da aynı hatayı almıyorum sebebi nedir ?
Huseyin
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Benim deneyimim yok.

Bağlayıcıyı kendin açıkça mı çağırıyorsun? Komut satırı nasıl? _start'ı crt1.o herhalde otomatik olarak ekliyor ve senin _start'la karışıyor.

main de çalıştırılabilir programlar için gerekir. Eğer kernel ile ilgiliyse sanırım program değil, program parçası (.o dosyası) oluşturman gerekiyor.

Ali
Avatar
huseyin #3
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hayır kernel ile ilgili değil bu basit bir deneme başarırsam ayrıntılı olarak açıklıcam :D

Bağlayıcıyı kendim system komutu ile çağırıyorum komutlarını da kendim giriyorum anladığım kadarıyla crt1.o ile linklenmemesi gerekli ama ne ile linklenmeli dediğim gibi windows üzerinde golink te bir problem çıkmadı linux için alternatif linker tavsiyeniz var mı yoksa ld yi kullanmayı mı öğrenmeliyim ?
Huseyin
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kullandığın bağlayıcı satırını gösterirsen bilen arkadaşlar yardımcı olurlar.

Ali
Avatar
huseyin #5
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
benim istediğim sadece libc ve linux e olan bağlanma
windows da da aynı şekilde windows msvcrt ye bağlıyorum ama golink kullanıyorum baktım golink in linux sürümü mevcut değil ld kullanım ddim ama sanırım beceremedim
Kullandığım komut bu
ld -s -dynamic-linker /lib/ld-linux.a -o dosyaadi dosya.o  /lib/libc.a
Huseyin
Avatar
huseyin #6
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İlgilendiğiniz için çok teşekkür ederim sorunu çözdüm
Huseyin
Bu mesaj huseyin tarafından değiştirildi; zaman: 2012-07-26, 15:19.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 09:25:11 (UTC -08:00)