April 23, 2010

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2010

Alıntı (KUTALMIS):

>

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)

mingw de bir "unix ortamı", değil mi... Linux'ta bir program üzerinde ldd çalıştırılınca, o programın bağımlı olduğu kütüphaneleri söyler. Örneğin bir C++ programı için:

$ ldd deneme
       linux-gate.so.1 =>  (0x007f9000)
       libboost_filesystem.so.2 => /usr/lib/libboost_filesystem.so.2 (0x0079a000)
..

Programı -static seçeneği ile oluşturunca, statik program haline gelir:

$ ldd deneme
       not a dynamic executable

Boyu da 10 kat arttığına göre, bütün kodun programın içine gömüldüğünü düşünüyorum. Bunu görmek için nm'i çalıştırınca içinde tanımlanmamış tek bir işlev buluyorum:

$ nm deneme | grep ' U'
        U ___tls_get_addr

O da herhalde "thread local storage" ilgili olan ve belki de bu programda kullanılmayan bir işlev... Onun dışında bütün işlevler programa gömülü. Ben statik programdan bunu anlıyorum.

Belki de mingw'de .a dosyalarının farklı olmalarını gerektiren nedenler vardır.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2010

Alıntı (KUTALMIS):

>

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ı

Evet. ld'nin belgesi, -lkutuphane yazıldığında normalde libkutuphane.a dosyası arandığını; sistemine göre libkutuphane.so da aranabildiğini söylüyor.

Alıntı:

>

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

Benim bildiğim, yalnızca .so varsa, onunla yalnızca dinamik program yapabilirsin.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 28, 2010

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 01, 2010

Kutalmis Bey ile Ali Bey arasındaki bilgi alışverişi bittiğine göre bende merak ettiğim sorulara geri dönebilirim:

Alıntı:

>

Ö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.

Burada ne demek istediğinizi açıkcası anlamadım. Çünkü abuzittin() diye işlev tanımlı değilse ne olursa olsun hata veriyor:

Örnek olarak deneme.d adlı bir dosyamız olsun ve içeriği şu olsun:


import sds;
void main()
{
 can();
abuzittin();
 }

ve sds modülümüz şu olsun:

module sds;

void can()
{
	int a = 11;
}

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 ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 01, 2010

Alıntı (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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 01, 2010

Teşekkürler. Tam dediğiniz gibi oldu.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 01, 2010

Walter Bright'ın bu konunun başlığına uygun bir yazısı:

http://www.drdobbs.com/blog/archives/2010/05/improving_compi.html

Derleyici hata mesajları üzerine konuşuyor. Kısa notlar:

  • Eskiden hatanın satırın hangi noktasında başladığını da söylüyormuş; yararsız gördüğü için kaldırmış

  • Deyim sonlarındaki noktalı virgüller gibi aslında gereksiz olan yazım kurallarının derleyicinin hata vermesinde yardımı oluyormuş

  • "uyumsuz tür" gibi kullanışsız mesajlar yerine "double beklerken int geldi" gibi açıklayıcı mesajlar daha iyi

  • Hata bulunca devam edip etmeme konusunda birden çok yöntem var: ilk hatada dur, N hatada dur, ilk noktalı virgüle kadar gözardı et ve sonrasını derlemeye devam et, vs.

  • Tanınmayan bir isim görüldüğünde yazım hatasıdır diye doğrusunu öner

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2 3
Next ›   Last »