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.
/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]
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