OnWorks Linux ve Windows Çevrimiçi İş İstasyonları

Logo

İş İstasyonları için Çevrimiçi Ücretsiz Barındırma

<Önceki | İçerik | Sonraki>

6.10. Alet Zincirinin Ayarlanması‌

Artık son C kitaplıkları kurulduğuna göre, araç zincirini, yeni derlenmiş herhangi bir programı bu yeni kitaplıklara bağlayacak şekilde ayarlamanın zamanı geldi.

görüntü

/tools/bin/{ld,ld-eski}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-eski}

/tools/bin/{ld-new,ld}

/tools/bin/{ld,ld-eski}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-eski}

/tools/bin/{ld-new,ld}

İlk olarak, yedekleyin /aletler linker'ı seçin ve bunu 5. bölümde yaptığımız ayarlanmış linker ile değiştirin. /araçlar/$(uname -m)-pc-linux-gnu/bin:


mv mv mv

ln

-v

-v

-v

mv mv mv

ln

-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

Ardından, GCC teknik özellikler dosyasını yeni dinamik bağlayıcıya işaret edecek şekilde değiştirin. Tüm "/tools" örneklerini silmek, dinamik bağlayıcıya giden doğru yolu bize bırakmalıdır. Ayrıca özellikler dosyasını, GCC'nin doğru başlıkları ve Glibc başlangıç ​​dosyalarını nerede bulacağını bilmesi için ayarlayın. A susuzluk komut bunu başarır:


gcc -dumpspecs | sed -e 's@/tools@@g' \

-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \

-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \

`dizin adı $(gcc --print-libgcc-dosya-adı)`/specs

gcc -dumpspecs | sed -e 's@/tools@@g' \

-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \

-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \

`dizin adı $(gcc --print-libgcc-dosya-adı)`/specs


Amaçlanan değişikliğin gerçekten yapıldığını doğrulamak için özellikler dosyasını görsel olarak incelemek iyi bir fikirdir.

Bu noktada, ayarlanmış takım zincirinin temel işlevlerinin (derleme ve bağlama) beklendiği gibi çalıştığından emin olmak zorunludur. Bunu yapmak için aşağıdaki akıl sağlığı kontrollerini gerçekleştirin:


echo 'int main(){}' > kukla.c

cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'

echo 'int main(){}' > kukla.c

cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'


Hata olmamalıdır ve son komutun çıktısı (dinamik bağlayıcı adında platforma özgü farklılıklara izin vererek) olacaktır:


[Program yorumlayıcısı isteniyor: /lib64/ld-linux-x86-64.so.2]

[Program yorumlayıcısı isteniyor: /lib64/ld-linux-x86-64.so.2]


görüntü

64 bit sistemlerde unutmayın / lib dinamik bağlayıcımızın konumudur, ancak /lib64 içindeki sembolik bir bağlantı aracılığıyla erişilir.


not

32 bit sistemlerde yorumlayıcı /lib/ld-linux.so.2 olmalıdır.

not

32 bit sistemlerde yorumlayıcı /lib/ld-linux.so.2 olmalıdır.

Şimdi doğru başlangıç ​​dosyalarını kullanacak şekilde ayarlandığımızdan emin olun:


grep -o '/usr/lib.*/crt[1in].*başarılı' dummy.log

grep -o '/usr/lib.*/crt[1in].*başarılı' dummy.log


Son komutun çıktısı şöyle olmalıdır:


/usr/lib/../lib/crt1.o başarılı oldu

/usr/lib/../lib/crti.o başarılı oldu

/usr/lib/../lib/crtn.o başarılı oldu

/usr/lib/../lib/crt1.o başarılı oldu

/usr/lib/../lib/crti.o başarılı oldu

/usr/lib/../lib/crtn.o başarılı oldu


Derleyicinin doğru başlık dosyalarını aradığını doğrulayın:


grep -B1 '^ /usr/include' dummy.log

grep -B1 '^ /usr/include' dummy.log

Bu komut aşağıdaki çıktıyı döndürmelidir:


#include <...> arama burada başlar:

/ usr / include

#include <...> arama burada başlar:

/ usr / include

Ardından, yeni bağlayıcının doğru arama yollarıyla kullanıldığını doğrulayın:


grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

'-linux-gnu' ile bileşenleri olan yollara yapılan referanslar yok sayılmalıdır, aksi halde son komutun çıktısı şöyle olmalıdır:


SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")

SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")

Ardından doğru libc'yi kullandığımızdan emin olun:


grep "/lib.*/libc.so.6" kukla.log

grep "/lib.*/libc.so.6" kukla.log

Son komutun çıktısı şöyle olmalıdır:


/lib/libc.so.6 açma girişimi başarılı oldu

/lib/libc.so.6 açma girişimi başarılı oldu

Son olarak, GCC'nin doğru dinamik bağlayıcıyı kullandığından emin olun:


grep kukla bulundu.log

grep kukla bulundu.log

Son komutun çıktısı şöyle olmalıdır (dinamik bağlayıcı adında platforma özgü farklılıklara izin vererek):


/lib/ld-linux-x86-64.so.2 konumunda ld-linux-x86-64.so.2 bulundu

/lib/ld-linux-x86-64.so.2 konumunda ld-linux-x86-64.so.2 bulundu

Çıktı yukarıda gösterildiği gibi görünmüyorsa veya hiç alınmıyorsa, ciddi bir yanlışlık var demektir. Sorunun nerede olduğunu bulmak ve düzeltmek için adımları araştırın ve yeniden izleyin. Bunun en olası nedeni, teknik özellikler dosyası ayarında bir şeylerin ters gitmesidir. Sürece devam etmeden önce herhangi bir sorunun çözülmesi gerekecektir.

Her şey düzgün çalıştığında, test dosyalarını temizleyin:


rm -v kukla.c a.out kukla.log

rm -v kukla.c a.out kukla.log


OnWorks'te En İyi OS Bulut Bilişimi: