Mesajlarını aradığınız kullanıcı: KUTALMIS (9)

konu: D de Hata Mesajları Yeterli Mi ?  ; forum:: D Programlama Dili
KUTALMIS #1
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bunu istersek "dmd deneme.d" komutunu vererek, istersek "dmd deneme.d sds.d" komutunu vererek derleyelim şu şekilde hata veriyor:
deneme.d(5): Error: undefined identifier abuzittin
deneme.d(5): Error: function expected before (), not abuzittin of type int

Bundan ben şunları anlıyorum.

Derleyici import edilen bütün modüldeki işlevlerden ne olursa olsun haberdar. Ama derleyici verillen komutta modül ismi belirtilmiş mi yoksa belirtilmemiş mi haberdar değil. Bende neden haberdar değil. Sizce haberdar olması gerekmiyor mu diyorum.

Herhalde siz abuzittin işlevi desenizde hata almazsınız dediğinizde başka bir şey demek istediniz ve ben anlamadım.
"dinamik bir kütüphane import edersen ve rastgele işlev çağırırsan derleyici bu işlevin tanımlı olup olmadığını anlayamaz ve hata vermez. Ama en sonunda bağlayıcı bunu anlar ve hata verir." mi demek istediniz ?

Deneme esnasında abuzittin işlevinin diğer modüllerde olup olmadığını derleyici bilemez, yani o işlevden kesinlikle haberdar değildir , bunu tekrarlıyorum. Sadece bağlayıcı ilgilenir bununla. Yani abuzittin işlevi hiç olmasa bile derleyici derler.

Sorunun sebebi ise farklı, c++ da, c99 da ve anladığım kadarıyla d'de de fonksiyonların prototipi verilmezse, dönüş değeri varsayılan olarak int kabul edilmiyor, ve C++ daki gibi d de de prototipi olmadığında hata oluşuyor.

Özetle, deneme modülünü
import sds; 
void abuzittin();
void main()
{  
  can();
 abuzittin();
  }

şeklinde derlerseniz (derlemekten kastım ,"dmd deneme.d -c " ) hatasız bir şekilde derlendiğini göreceksiniz.
Derleyici bu fonksiyonun olup olmadığı ile ilgilenmez, diğer modüllerde tanımlı olmasa da deneme.o ya bu fonksiyonun çağrısını yazar, ancak bağlama aşamasında, abuzittin işlevi bulunamadığından hata oluşur.

Özetle hata işlevin olmamasından değil, bildiriminin yapılmamasından kaynaklanıyor.
Bu mesaj KUTALMIS tarafından değiştirildi; zaman: 2010-05-01, 12:48.
konu: baglayici yazmak  ; forum:: D Programlama Dili
KUTALMIS #2
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1916
Geçen konuda bağlayıcı derleyici problemi olmuştu, burda da başlığı görünce direkt atladım :) yine de bilgi bilgidir, belki başka bir arkadaşta bu yazıyı görünce linker yazmaya karar verir :D

canalpay:
Ama ben bunun yanlış anlaşılmasına ve linker hakkında yazı yazılmasına sevindim. Ama şunu merak ediyorum. Bir derleyicinin yaptığı şeylerin aşamalarını öğrenebileceğim iyi bir Türkçe kaynak var mı ? Ali Bey ile KUTALMIS bey arasında geçen konuşmalarda benimde arkaplanda neler olduğunu öğrenmem gerektiğini düşündüm.

Ben bu konu hakkında da kaan hoca yoluyla bilgi sahibi olduğumdan, onun yazdığı makaleleri örnek göstereyim. Ayrıca yine dernek bünyesinde geliştirilen bir derleyici projesi var, bittiğinde kaynak koduyla birlikte dökümanları da yayınlanacaktır.

ÇEVİRİCİ PROGRAMLAR, DERLEYİCİLER VE YORUMLAYICILAR
http://www.kaanaslan.com/resource/article/displa…?page=2…

DERLEYİCİLERİN KOD OPTİMİZASYONLARI
http://www.kaanaslan.com/resource/article/displa…?page=1…
http://www.kaanaslan.com/resource/article/displa…?page=1…
http://www.kaanaslan.com/resource/article/displa…?page=1…

MICROSOFT C/C++ DERLEYİCİLERİNDE FONKSİYON ÇAĞIRMA BİÇİMLERİ (CALLING CONVENTIONS)
http://www.kaanaslan.com/resource/article/displa…?page=2…

Ayrıca mdk dan bir arkadaşın kişisel sitesinde oldukça güzel yazılar olduğunu hatırlıyorum ama format atarken yer imlerini yedeklemeyi unuttuğumdan gitti. Yine de bir bakayım bulursam koyarım buraya.

(buldum ama daha fazla yazı vardı diye hatırlıyorum. http://www.diyezon.com/category/derleyici-tasarimi )
Bu mesaj 3 defa değişti; son değiştiren: KUTALMIS; zaman: 2010-04-30, 18:14.
konu: baglayici yazmak  ; forum:: D Programlama Dili
KUTALMIS #3
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1908
Öncelikle, derlenmiş bir kod, bağlandığında ne değişir buna bakmak lazım.
Çalişabilen dosya disk üzerinde bazı section denilen bölümlerden oluşuyor. Örnek, .text genelde kod kısmı, .data data kısmı, .bss ilk değer verilmemiş statik nesneler, .stack stack filan.

İşte bir derlenmiş dosyada, içindeki kod veya verilerin kodun bağlanması esnasında nereye yazılacağı bellidir. .text den sonra gelenler, kod, .data dan sonra gelenler data bölümüne yazılmalıdır.

Senin yapman gereken de şu, öncelikle bir dosya da section sayısı kadar yer ayıracaksın. sonra bu yerlere, derlenmiş modüllerde bulunan dataları yazacaksın. Bu dataların adresleri elinde olmalı, örneğin derlenmiş modülde _main, _degisken, _asdf gibi bulunan tüm etiketler, bağlama aşamasında adrese çevirilecek. Tabi ki disk üzerinde adrese değil, belleğe genişletildikten sonraki adrese.

Bu noktada çalışabilen dosyanın başlık kısmını iyi bilmen gerekiyor. Burada örneğin .text bölümünün disk üzerinde nerden başlayıp nereye kadar olduğu ve belleğe yüklendiğinde hangi adreesten başlayıp ne kadar uzun olduğu yazıyor.

Özetle senin yapman gereken, tüm derlenmiş modüllerde data bölümündekileri, tek bir dosyada data bölümüne, kod bölümündekileri kod bölümüne, bss bölümündekileri bss bölümüne yazmak ve, etiket isimleri olarak görünen yerlere gerçek adresleri yazmak.
Tabi o datanın dosya içindeki yerinden bahsetmiyorum, belleğe yüklendikten sonraki adresinden bahsediyorum, bu adresi de demin söylediğim gibi başlık kısmı sayesinde öğrenebilirsin.

İşin belki de en zor kısmı şu, dinamik kütüphane fonksiyonlarına bağlanmak. Bu fonksiyonların adresi bağlama sırasında bilinmediğinden, bunun yerine örneğin .text tablosunun sonunda bir jmp table yaratılır, dinamik kütüphane içindeki fonksiyonun adresi yerine, bu jmp tabledeki bir elemanın adresi yazılır. Tabi ki belleğe yüklenirken bu jmp table de gerçek fonksiyon adresleri vardır. (biz aslında import tablosundan çekiyoruz atlayacağımız adresi, loader ise import tablosuna gerçek fonksiyon adreslerini yazdığından biz herhangi bir fonksiyona bu jmp table ile atlayabiliyoruz)
Örnek bir jmp table.
[Resim: http://img530.imageshack.us/img530/6958/jmp.png]

Fonksiyonların gerçek adresleri o sisteme özgü bir yöntemle alınır. Örneğin windows da
#include <stdio.h>
#include <windows.h>
 
 
int main(){
    
    printf("\n%X",GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA"));
    
    getchar();
    return 0;    
}

Bu kod ile tüm fonksiyonların adresini alabilirsiniz. Dahası, doğrudan adresi ile bu fonksiyonları çağıra da bilirsiniz, hiç jmp table yada import table olmadan, trojan yazarken çok işe yarar :) Tabi bu loaderin işi, fazla karışmayalım.

Özetle
  • verilen derlenmiş modülerde, kod bölümündeki baytları, son dosyada kod bölümüne, data dakileri dataya vs. verilen sırada yaz.
  • başlık kısmını ayarla ve hangi bölümün bellekte hangi adresten başlayıp kaç bayt uzunluğunda olduğunu belirle.
  • bundan sonra, fonksiyon ve global nesne etiketleri yerine bu adresleri yerleştir.
  • dinamik bağlanacak fonksiyonların isimlerini dosya da ayrı bir yere yaz (import table) bu yerin de adresini başlık kısmına yaz.
  • kod kısmının sonunda, bir jmp tablosu oluştur ve her dinamik bağlantı için bir jmp olsun. Bu jmp lar import tablosundaki belli bir yerdeki adrese atlayacak ör: jmp [ds:1958] gibi, sonra bu ds:1958 kısmına tabiki işletim sistemi loaderi gerçek adresi yazacaktır.

Son olarak bir not. Daha önce ceviz de de bir kaç kez söylemiştim, çalışabilen dosya , aslında direkt main fonksiyonundan başlamaz. Derleyici kodundan başlar, ve derleyici kodunda sonlanır.
Peki bu kod nerden geliyor, nasıl bağlanıp bizim programımızın gerçek başlangıç noktası oluyor.

İşte bu derleyici kodu, genelde cr0.o , cr2.o ya da .obj gibi, derlenmiş ama bağlanmamış modüllerdir. Siz isteseniz de istemesenizde yazdığınız her porgramda, bağlayıcı aynı zamanda bu derlenmiş modülleri de sizin kodunuzla birlikte bağlar.
Tabi ld de başka bir fonksiyonu -e asd şeklinde giriş noktası belirleyebiliriz, kod içinde main fonksiyonu yoksa sorun olmaz, program gerçekten asd fonksiyonundan başlar, derleyici kodu eklenmez.

Özetle bunların hepsini düşünmek zorundasın ancak derleyiciden 10.000 kat daha kolay bir program olduğunu rahatlıkla söyleyebilirim.
konu: D de Hata Mesajları Yeterli Mi ?  ; forum:: D Programlama Dili
KUTALMIS #4
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1897
Hocam bu statik bağlanmış programları doğrudan kendi kernelimizde de kullanabiliyormuşuz, tabi bazı posix uyumlu sistem çağrıları şart (_exit, fork vb) Bir de elf loader tabiki. Ama bu yöntem işimi oldukça basitleştirecek.
Bir de gcc'yi kendi sistemine adapte etme veya herhangi bir C kütüphanesini kendi sistemin için derleme meselesi var ama çok daha meşakatli bir iş.
http://wiki.osdev.org/GCC_Cross-Compiler
http://wiki.osdev.org/Porting_Newlib
Bu mesaj KUTALMIS tarafından değiştirildi; zaman: 2010-04-28, 16:29.
konu: D de Hata Mesajları Yeterli Mi ?  ; forum:: D Programlama Dili
KUTALMIS #5
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1895
Hocam mingw nin .a dosyaları ,windows un .lib dosyalarıyla aynı, uzantı dışında. Ancak ben o dediğinizi daha önce denemiştim ve mingw de hiç birşey değişmemişti. Linuxda da öyle olacağını düşündüm ama olmamış , statik olayı baya hoşuma gitti :) gerçi 505 kb oldu 5 kb lik program ama yine de oldu.

Peki linux da -lkutuphane şeklinde kütüphaneyi gösterdiğimizde, -static e bakıp mı karar veriyor, .a ları mı .so ları mı kullanacağını.
Çünkü windowsda hangi dinamik kütüphane kullanılırsa kullanılsın, onun lib uzantılı import kütüphanesini projeye eklemek gerekyior, doğrudan .dll ler eklenemiyor. Ya da kısaca şöyle sorayım. internetten bir kütüphane indirdin, resim çevirme ile ilgili, içinde sadece .so dosyası ve başlık dosyaları var. Bu kütüphane kullanılabilir mi yoksa mingw de olduğu gibi yine bir .a dosyası gerekli mi.
Eğer gerekli ise, windows dan tek farkı statik bağlama da yapabilmesi, gerekli değilse, tamamen farklı bir durum.
konu: D de Hata Mesajları Yeterli Mi ?  ; forum:: D Programlama Dili
KUTALMIS #6
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1888
Hocam tabiki aynı zamanda arşiv dosyasılar, bunu kabul ediyorum, ancak bir statik kütüphane var bir de import kütüphanesi, ikisinin de uzantısı aynıdır ancak birisi doğrudan kod içerirken diğeri dinamik kütüphane içindeki fonksiyonlar hakkında bilgi içerir.
Bizim çoğunlukla kullandığımız ikinci yöntem, yani import kütüphaneleri, örneğin windows da bir dll oluşturulurken, yanında def dosyası ve lib dosyası da çıkar. İşte bu lib dosyası kesinlikle statik kütüphane değildir, test edilebilir.
Oluşan dll içindeki fonksiyonları kullanabilmek için bu lib ya da a dosyası projeye dahil edilir ancak program çalışmak için yine dinamik kütüphaneye ihtiyaç duyar.
Bu import kütüphaneleri windows da _MessageBoxA@16 gibi satırlar içerirler, @ karakterinin sonrası toplam parametre boyutudur.
Son olarak, herhangi bir kütüphaneyi kullanarak bir programı statik oluştur dediğinizde gerçekten statik olarak oluştuğunu test ettiniz mi?
(windows da .a lar sadece mingw de kullanılıyor)
konu: D de Hata Mesajları Yeterli Mi ?  ; forum:: D Programlama Dili
KUTALMIS #7
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1877
canalpay on 2010-04-21, 12:10:
Evet uzun zaman sonra bu konuyu canlandırdım.

Sorun şu :
dmd ezberletici.d dkv/dkvG.d dkv/bilgi.d dkv/dkvB.d
ezberletici.o:(.data+0x24): undefined reference to `_D8oluştur12__ModuleInfoZ'
ezberletici.o: In function `_Dmain':
dkv/dkvB.d:(.text._Dmain+0x91): undefined reference to `_D8oluştur6girişFZv'
collect2: ld returned 1 exit status
--- errorlevel 1
make: *** [derle] Hata 1

Burdaki hatanın farkındayım. "undefined reference to `_D8oluştur12__ModuleInfoZ'" yani oluştur.d derlemek için kullanılan koda eklenmemiş. Evet çok iyi ama bu hata neden derleyiciden gelmiyorda bağlayıcıdan geliyor ?

Derleyicinin import oluştur; kod parçacığının doğru çalışması için konsol satırına gerekli şey eklemediğim için hata vermesini beklerdim. Hadi olmadı kodumda oluştur.d'de tanımlanıp ana bölümde çağrılan işlev var. Eğer oluştur.d'yi eklemediysem giriş() işlevi tanımsız olmalı. O zaman niye giriş() işlevi tanımsız diye hata vermiyor?

Bence bu bağlayıcıdan önce derleyici hata vermesi gerekir.  Derleyici hata vermediği için 2 saat hata nerede diye aradım.

Sizce neden derleyici derliyorda bağlayıcı hata veriyor ? Derleyici böyle bir kodu nasıl derleyebilir ? Hiç bir şeyden haberi yok mu ?

Derleyicinin görevi o değildir zaten, derleyici sadece bir modülü derler, diğer modüllerle olan ilişkisiyle ilgilenmez.
Örneğin kod içinde, aslında hiç var olmadığı halde abuzittin() diye bir fonksiyon kullanırsan, derleyici bunun diğer modüllerden birinde olduğunu varsayarak obj modülüne ekler. C de önüne _ ekleniyor normalde ama linux da eklenmediğini farkettim :) (gcc 4.3.2).

Bağlama aşamasında ise, burada kullanılan fonksiyonlar modül içerisinde aranır, eğer bulunursa, kodda yerine bu adres yazılır, bulunamazsa birlikte derlenen kütüphanelere bakılır, statik kütüphane ise, oradaki fonksiyon koda yazılır ve diğer modüllerde ilgili yerlere adresi eklenir, dinamik kütüphane ise, geçici adres yazılır, import tablosuna fonksiyon adı yazılır ve program yüklenene kadar sadece isimler vardır, asıl adresler ancak program yüklendiğinde bilinir.
Ayrıca hem statik kütüphanelerde hem de dinamik kütüphanelerde, windowsda .lib, linux da ise, .a dosyaları projeye eklenir, ama çoğunlukla bizim kullandığımız .a lar, fonksiyon içermez, sadece dinamik kütüphanelerdeki fonksiyonlar hakkında bilgi içerir. Ancak fonksiyon yine .so ya da .dll içindedir. Örneğin windows da soket fonksiyonlarını kullanmak için projeye wsock32.lib dosyasını eklememiz, soket fonksiyonlarının bu kütüphanede olduğunu göstermez. Fonskiyonlar yine wsock32.dll dedir. Amma saptırdım konuyu :)

Özetle derleyicinin undefined reference diye hata vermesi saçmadır çünkü tüm modüllerle tek tek ilgilenir, tümünü bağlayan ise bağlayıcı olduğundan mesajı vermesi gereken o.
konu: D'yi online derlemek(Güncel Derleyici İle)  ; forum:: D Programlama Dili
KUTALMIS #8
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1668
canalpay:
Linux da sistem hakkında bilgiler veren fonksiyonlar varsa ve çalışmasına izin veriliyorsa sanal makina mı gerçek sistem mi anlaşılabilir.

Ayrıca ideone 'mkdir deneme' komutunu bile çalıştırmıyor. Hatta std.path modülündeki sep değişkenini bile ideone ile yazdıramadım. Yani düşünün artık nasıl bir kısıtlama olduğunu. Eğer Linuxta böyle kısıtlama nasıl yapılır bilen birisi var ise güvenlik olarak hiç korkmaya gerek yok bence.

Derleyicilerin sentaks analiz modülü gibi bir program ile kod içindeki fonksiyonlar analiz edilip izin verilmeyebilir.
konu: D'yi online derlemek(Güncel Derleyici İle)  ; forum:: D Programlama Dili
KUTALMIS #9
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1660
Linux'u pek kullanmasam da root olmadan pek bir zarar verilebileceğini sanmıyorum, neredeyse resim açarken bile root şifresi soruyor :)
Belki de derlemeden önce kodu tarıyordur, antivirüsler derlenmiş kodu taradığına göre çok daha kolay olsa gerek, pack,cyript vs. yok, saf kod.

Linux da sistem hakkında bilgiler veren fonksiyonlar varsa ve çalışmasına izin veriliyorsa sanal makina mı gerçek sistem mi anlaşılabilir.
Ben de merak ettim..
Özel Karakterler:
Özel sorgulamalar

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-19, 04:23:56 (UTC -08:00)