GNU/Linux >> Znalost Linux >  >> Linux

Jak lze samotný dynamický linker/loader dynamicky propojit, jak uvádí `soubor`?

  1. Ano, při inicializaci se připojí. Technicky dynamický linker nepotřebuje rozlišení a přemístění objektů pro sebe, protože je plně vyřešen tak, jak je, ale definuje symboly a musí se o ně postarat při řešení binárního kódu, který „interpretuje“, a tyto symboly jsou aktualizovány. ukázat na jejich implementace v načtených knihovnách. Konkrétně to ovlivňuje malloc — linker má vestavěnou minimální verzi s odpovídajícím symbolem, ale ta je po načtení a přemístění nahrazena verzí knihovny C (nebo dokonce vloženou verzí, pokud nějaká existuje), přičemž je třeba dbát na to, aby se tak nestalo se to nestane v okamžiku, kdy by to mohlo přerušit linker.

    Krvavé podrobnosti jsou v rtld.c , v dl_main funkce.

    Všimněte si však, že ld.so nemá žádné vnější závislosti. Můžete vidět symboly spojené s nm -D; žádný z nich není nedefinovaný.

  2. Manuálová stránka odkazuje pouze na položky přímo pod /lib , tj. /lib/ld.so (dynamický linker libc 5, který podporuje a.out ) a /lib*/ld-linux*.so* (dynamický linker libc 6, který podporuje ELF). Manuálová stránka je velmi specifické a ld.so není ld-2.28.so .

    Dynamický linker, který se nachází na velké většině současných systémů, nezahrnuje a.out podporu.

file a ldd hlásit různé věci pro dynamický linker, protože mají různé definice toho, co tvoří staticky propojenou binární hodnotu. Pro ldd , je binární soubor staticky propojen, pokud nemá DT_NEEDED symboly, tj. žádné nedefinované symboly. Pro file , binární soubor ELF je staticky propojen, pokud nemá PT_DYNAMIC sekce (toto se změní ve verzi file následujících 5,37; nyní používá přítomnost PT_INTERP sekce jako indikátor dynamicky propojeného binárního souboru, který odpovídá komentáři v kódu).

Dynamický linker knihovny GNU C nemá žádné DT_NEEDED symboly, ale má PT_DYNAMIC sekce (protože jde technicky o sdílenou knihovnu). Výsledkem je ldd (což je dynamický linker) označuje, že je staticky propojen, ale file označuje, že je dynamicky propojen. Nemá PT_INTERP část, takže příští vydání file bude také indikovat, že je staticky propojen.

$ 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

(s file 5.35)

$ 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

(s aktuálně vyvíjenou verzí file ).


Linux
  1. Jak si mohu vybavit argument předchozího příkazu bash?

  2. Jak mohu získat stav klávesnice v Linuxu?

  3. Jak mohu spustit kód PHP z příkazového řádku?

  1. Jak mohu vidět velikost souborů a adresářů v linuxu?

  2. Jak mohu získat informace o kontejneru Docker Linux ze samotného kontejneru?

  3. Jak mohu znát absolutní cestu běžícího procesu?

  1. Jak mohu upravit $PATH na linuxu?

  2. Jak mohu najít nejstarší soubor ve stromu adresářů

  3. Jak mohu rastrovat veškerý text v PDF?