Dinamik bağlayıcı / yükleyicinin kendisi `dosya` tarafından bildirildiği gibi dinamik olarak nasıl bağlanabilir?


12

Ve paylaşılan nesne bağımlılıkları düşünün /bin/bashiçerir, /lib64/ld-linux-x86-64.so.2(dinamik bağlayıcı / yükleyici):

ldd /bin/bash
    linux-vdso.so.1 (0x00007fffd0887000)
    libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)

İnceleme /lib64/ld-linux-x86-64.so.2, bunun aşağıdakiler için bir sembolik olduğunu gösterir /lib/x86_64-linux-gnu/ld-2.28.so:

ls -la /lib64/ld-linux-x86-64.so.2 
lrwxrwxrwx 1 root root 32 May  1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so

Ayrıca, fileraporlar /lib/x86_64-linux-gnu/ld-2.28.sokendisine dinamik olarak bağlanır:

file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

Bilmek isterdim:

  1. Dinamik olarak bağlayıcı / yükleyicinin ( /lib64/ld-linux-x86-64.so.2) kendisi dinamik olarak nasıl bağlanabilir? Çalışma zamanında kendini bağlar mı?
  2. /lib/x86_64-linux-gnu/ld-2.28.soa.out ikili dosyalarını ( man ld.so) işlemek için belgelenmiştir , ancak /bin/bashELF yürütülebilir mi?

Ld.so programı, uzun zaman önce kullanılan bir format olan a.out ikili dosyalarını işler; ld-linux.so * (libc5 için /lib/ld-linux.so.1, glibc2 için /lib/ld-linux.so.2) herkesin yıllardır kullandığı ELF.


Çekirdek, böylesi süptil taksonomik incelikleri umursamıyor (ve siz de değil ;-)). Çekirdek yalnızca bir tercümana ihtiyacı olan ELF'ler ile olmayanlar arasında fark yaratır . Ve AFAIK, kendisine ihtiyaç duyan bir tercüman kullanamazsınız .
mosvy

@StephenKitt benim değil ( /lib/x86_64-linux-gnu/ld-2.28.so, debian 10 buster)
mosvy

@mosvy evet, özür dilerim, filestatik ikilileri nasıl tanımladığıyla ilgili yanlış yorum ve gerçeği karıştırdım ld-2.28.so... Farklılaştırıcı PT_DYNAMIC.
Stephen Kitt

Yanıtlar:


17
  1. Evet, başlatıldığında kendini bağlar. Teknik olarak dinamik bağlayıcının kendisi için nesne çözünürlüğüne ve yer değiştirmesine ihtiyacı yoktur, çünkü tam olarak olduğu gibi çözülür, ancak sembolleri tanımlar ve ikili "çözdüğü" çözümlenirken bunlarla ilgilenmek zorundadır ve bu semboller güncellenir yüklü kütüphanelerdeki uygulamalarına işaret etmek. Özellikle, bu etkiler malloc- bağlayıcı, karşılık gelen sembolle dahili olarak minimal bir sürüme sahiptir, ancak yüklendikten ve yerini değiştirdikten sonra (veya varsa araya yerleştirilmiş bir sürümle) C kütüphanesinin sürümü ile değiştirilir. bunun bağlayıcıyı kırabileceği bir noktada olmamasını sağlamak için alınır.

    Korkunç ayrıntılar vardır rtld.ciçinde, dl_mainişlevi.

    Ancak bunun ld.soharici bağımlılıkları olmadığını unutmayın . Dahil olan sembolleri görebilirsiniz nm -D; hiçbiri tanımlanmamış.

  2. Manpage yalnızca doğrudan girişlere /lib, yani /lib/ld.so (destekleyen libc 5 dinamik bağlayıcı a.out) ve /lib*/ld-linux*.so*(ELF'yi destekleyen libc 6 dinamik bağlayıcı ) girişlerine atıfta bulunur . Manpage çok özeldir ve ld.sodeğildir ld-2.28.so.

    Mevcut sistemlerin büyük çoğunluğunda bulunan dinamik bağlayıcı a.outdestek içermez .

fileve ldddinamik bağlayıcı için farklı şeyler rapor edin, çünkü statik olarak bağlantılı bir ikili dosyayı neyin farklı tanımları var. Çünkü ldd, hiçbir DT_NEEDEDsembol yoksa , yani tanımsız sembol yoksa, bir ikili statik olarak bağlıdır . Çünkü file, bir PT_DYNAMICbölüme sahip değilse bir ELF ikili dosyası statik olarak bağlanmıştır (bu, fileaşağıdaki 5.37'nin yayınlanmasında değişecektir ; şimdi , bir PT_INTERPbölümün varlığını, dinamik olarak bağlı bir ikiliğin göstergesi olarak kullanır ve kod).

GNU C kütüphanesi dinamik bağlayıcısının herhangi bir DT_NEEDEDsembolü yoktur, ancak bir PT_DYNAMICbölümü vardır (teknik olarak paylaşılan bir kütüphane olduğu için). Sonuç olarak, ldd(dinamik bağlayıcı olan) statik olarak bağlı olduğunu, ancak filedinamik olarak bağlı olduğunu gösterir. Bir PT_INTERPbölümü yok, bu yüzden bir sonraki sürümü filede statik olarak bağlı olduğunu gösterecektir.

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

( file5.35 ile)

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(şu anda geliştirilmekte olan sürümü ile file).


Neden "yorumlama" kelimesi dinamik bağlantı bağlamında kullanılıyor? Bu kelime genellikle programlama dilleri bağlamında kullanılır.
Shuzheng

"GNU C kütüphanesi dinamik bağlayıcısı" ile ne demek istiyorsun? /lib*/ld-linux*.so*Üçüncü bir dinamik bağlayıcıdan mı bahsediyorsunuz ?
Shuzheng

lddDinamik bağlayıcıyı statik olarak bağlı olarak raporları nerede görebilirsiniz ? Paylaşılan nesne bağımlılıkları listesi boş olduğu için mi?
Shuzheng

Dinamik olarak bağlı programların yürütülmeden önce kendileri için bazı çalışmaları gerekir; bu iş, bir yorumlayıcıya benzer bir rol oynayan dinamik bağlayıcı tarafından yapılır - bilgisayarın çalıştırabileceği bir şey üretmek için yer değiştirme tablolarını vb.
Stephen Kitt

“GNU C library dynamic linker” dediğimde, genellikle olarak gönderilen GNU C kütüphanesinde bulunan uygulamaya atıfta bulunuyorum /lib*/ld-linux*.so*. Dinamik bağlayıcının kökenini belirttim çünkü Linux için başka uygulamalar da var.
Stephen Kitt

0
  1. fileProgramın dinamik olarak bağlayıcı / yükleyicinin dinamik olarak kendisine bağlı olması konusunda yanlış olduğundan şüpheleniyorum . lddProgram böyle düşünmüyor. En azından benim sistemimde değil (Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soayrıca şunu okur: "ld-linux.so * ELF'yi işler" . Sisteminizde (ve bu arada benimki) her ikisi de ELF ve (eski eski) a.out formatını işleyebildiğimden çıkardığım aynı ikiliye sembolik bağlantılardır.


kabul edilen cevaba hangi bilgileri eklersiniz?
miracle173

2
@ miracle173 bu cevap kabul edilen cevaptan daha eski ;-).
Stephen Kitt

Haklısın. Bunu özledim. Soru ve kabul edilen cevabın çok eski olduğunu düşündüm ve bu cevap son saatlerde gönderildi. Birisi postayı değiştirene kadar downvote'umu geri alamıyorum.
miracle173
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.