ld.so(8) - wariua/manpages-ko GitHub Wiki
ld.so, ld-linux.so - λμ λ§μ»€/λ‘λ
μ΄λ€ λμ λ§ν¬ λ νλ‘κ·Έλ¨ λ΄μ§ 곡μ μ€λΈμ νΈλ₯Ό μ€νν¨μΌλ‘μ¨ λμ λ§μ»€λ₯Ό κ°μ μ μΌλ‘ μ€νν μλ μκ³ (μ΄ κ²½μ° λμ λ§μ»€μ λͺ
λ Ήν μ΅μ
μ μ€ μ μμΌλ©°, ELFμΈ κ²½μ° νλ‘κ·Έλ¨μ .interp
μΉμ
μ μ μ₯λ λμ λ§μ»€λ₯Ό μ€ννλ€.) λ€μμ²λΌ μ§μ μ€νν μλ μλ€.
/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]
νλ‘κ·Έλ¨ ld.so
λ° ld-linux.so*
λ νλ‘κ·Έλ¨μ νμν 곡μ μ€λΈμ νΈ(곡μ λΌμ΄λΈλ¬λ¦¬)λ€μ μ°Ύμμ μ μ¬νκ³ νλ‘κ·Έλ¨μ μ€νμ μν μ€λΉλ₯Ό ν λ€μ μ€ννλ€.
리λ
μ€ λ°μ΄λ리λ€μ μ»΄νμΌ λ ld(1)
μ -static
μ΅μ
μ μ€ κ²½μ°κ° μλλΌλ©΄ λμ λ§ν¬(λ°νμ λ§ν¬)κ° νμνλ€.
ld.so
νλ‘κ·Έλ¨μ μμ μ μ°λ λ°μ΄λ리 νμμΈ a.out λ°μ΄λ리λ₯Ό λ€λ£¬λ€. ld-linux.so*
(libc5μμ /lib/ld-linux.so.1
, glibc2μμ /lib/ld-linux.so.2
) νλ‘κ·Έλ¨μ λ μ΅μ μΈ ELF νμμΌλ‘ λ λ°μ΄λ리λ₯Ό λ€λ£¬λ€. λ νλ‘κ·Έλ¨μ λμ λ°©μμ΄ λμΌνλ©° κ°μ μ§μ νμΌ λ° νλ‘κ·Έλ¨(ldd(1)
, ldconfig(8)
, /etc/ld.so.conf
)μ μ¬μ©νλ€.
곡μ μ€λΈμ νΈ μμ‘΄μ±μ ν΄κ²°ν λ λμ λ§μ»€μμλ λ¨Όμ κ° μμ‘΄μ± λ¬Έμμ΄μ μ¬λμκ° μλμ§ νμΈνλ€. (λ§ν¬ λ μ¬λμκ° ν¬ν¨λ 곡μ μ€λΈμ νΈ κ²½λ‘λͺ μ μ§μ νμΌλ©΄ κ·Έλ΄ μ μλ€.) μ¬λμκ° μμΌλ©΄ κ·Έ μμ‘΄μ± λ¬Έμμ΄μ (μλ λλ μ λ) κ²½λ‘λͺ μΌλ‘ ν΄μνμ¬ κ·Έ κ²½λ‘λͺ μΌλ‘ 곡μ μ€λΈμ νΈλ₯Ό μ μ¬νλ€.
곡μ μ€λΈμ νΈ μμ‘΄μ±μ μ¬λμκ° μμΌλ©΄ λ€μ μμλ‘ νμμ νλ€.
-
λ°μ΄λ리μ dynamic μΉμ μμ± DT_RPATHκ° μμΌλ©΄μ DT_RUNPATH μμ±μ΄ μ‘΄μ¬νμ§ μμΌλ©΄ κ±°κΈ° λͺ μλ λλ ν°λ¦¬λ€μ μ¬μ©. DT_RPATH μ¬μ© λ°©μμ μ κ±°λ μμ μ΄λ€.
-
νκ²½ λ³μ
LD_LIBRARY_PATH
λ₯Ό μ¬μ©. λ¨ μ€ν νμΌμ΄ μμ μ€ν λͺ¨λ(μλ μ°Έκ³ )λ‘ λκ³ μμΌλ©΄ μ΄ λ³μλ₯Ό 무μνλ€. -
λ°μ΄λ리μ dynamic μΉμ μμ± DT_RUNPATHκ° μμΌλ©΄ κ±°κΈ° λͺ μλ λλ ν°λ¦¬λ€μ μ¬μ©. DT_NEEDED (μ§μ μμ‘΄) νλͺ©μ΄ μꡬνλ μ€λΈμ νΈλ€μ μ°Ύλ λ°λ§ κ·Έ λλ ν°λ¦¬λ€μ νμνλ€. κ·Έ μ€λΈμ νΈμ μμμ μ°Ύλ λ°λ μ μ©λμ§ μμΌλ―λ‘ κ·Έ μ€λΈμ νΈμ λ°λ‘ DT_RUNPATH νλͺ©μ΄ μμ΄μΌ νλ€. μ΄λ μμ‘΄ νΈλ¦¬ λ΄ μμλ€ λͺ¨λμ νμμ μ μ©λλ DT_RPATHμ λ€λ₯Έ μ μ΄λ€.
-
μΊμ νμΌ
/etc/ld.so.cache
. μ΄ νμΌμ μμ μ°Ύμλ ν보 곡μ μ€λΈμ νΈλ€μ λΌμ΄λΈλ¬λ¦¬ κ²½λ‘λ₯Ό λ§λΆμ¬μ λ§λ λͺ©λ‘μ΄λ€. λ€λ§ λ°μ΄λ리λ₯Ό-z nodeflib
λ§μ»€ μ΅μ μ μ¨μ λ§ν¬νλ€λ©΄ κΈ°λ³Έ κ²½λ‘λ€ λ΄μ 곡μ μ€λΈμ νΈλ€μ 건λλ΄λ€. νλμ¨μ΄ λ₯λ ₯λ³ λλ ν°λ¦¬(μλ μ°Έκ³ )μ μ€μΉλ 곡μ μ€λΈμ νΈλ₯Ό λ€λ₯Έ 곡μ μ€λΈμ νΈλ³΄λ€ μ νΈνλ€. -
κΈ°λ³Έ κ²½λ‘
/lib
, κ·Έ λ€μμΌλ‘/usr/lib
. (μΌλΆ 64λΉνΈ μν€ν μ²μμλ 64λΉνΈ 곡μ μ€λΈμ νΈλ€μ κΈ°λ³Έ κ²½λ‘κ°/lib64
λ°/usr/lib64
μ΄λ€.) λ°μ΄λ리λ₯Ό-z nodeflib
λ§μ»€ μ΅μ μ μ¨μ λ§ν¬νλ€λ©΄ μ΄ λ¨κ³λ₯Ό 건λλ΄λ€.
λμ λ§μ»€λ rpath μ§μ νλͺ©(DT_RPATH λλ DT_RUNPATH)μμ νΉμ ν ν° λ¬Έμμ΄λ€μ μμλ³Έλ€. κ·Έ λ¬Έμμ΄λ€μ λ€μκ³Ό κ°μ΄ μΉννλ€.
-
$ORIGIN
(λλ${ORIGIN}
) -
νλ‘κ·Έλ¨ λ΄μ§ 곡μ μ€λΈμ νΈλ₯Ό λ΄μ λλ ν°λ¦¬λ‘ νμ₯λλ€. μ¦
somedir/app
μ μμΉν μμ©μ λ€μκ³Ό κ°μ΄ μ»΄νμΌ νλ©΄gcc -Wl,-rpath,'$ORIGIN/../lib'
somedir
μ΄ λλ ν°λ¦¬ ꡬ쑰μμ μ΄λλ κ°μsomedir/dir
μμ κ΄λ ¨ 곡μ μ€λΈμ νΈλ₯Ό μ°Ύκ² λλ€. μ΄λ₯Ό μ΄μ©νλ©΄ νΉμ λλ ν°λ¦¬μ μ€μΉν νμ μμ΄ μ무 λλ ν°λ¦¬μλ νμ΄ μ£Όλ©΄ μ체 곡μ μ€λΈμ νΈλ₯Ό μ°Ύμλ΄λ "ν΄ν€" μμ©μ μ½κ² λ§λ€ μ μλ€. -
$LIB
(λλ${LIB}
) - μν€ν
μ²μ λ°λΌμ
lib
λλlib64
λ‘ νμ₯λλ€. (κ°λ Ή x86-64μμλlib64
λ‘ νμ₯λκ³ x86-32μμλlib
λ‘ νμ₯λλ€.) -
$PLATFORM
(λλ${PLATFORM}
) - νΈμ€νΈ μμ€ν
μ νλ‘μΈμ μ νμ λμνλ λ¬Έμμ΄(κ°λ Ή "x86_64")λ‘ νμ₯λλ€. μΌλΆ μν€ν
μ²μμλ 리λ
μ€ μ»€λμ΄ λμ λ§μ»€μκ² νλ«νΌ λ¬Έμμ΄μ μλ € μ£Όμ§ μλλ€. 보쑰 벑ν°(
[[getauxval(3)]] μ°Έκ³ )μ
AT_PLATFORM
μμ μ΄ λ¬Έμμ΄ κ°μ κ°μ Έμ¨λ€.
--audit list
-
list
μ μ§μ ν μ€λΈμ νΈλ€μ κ°μ¬μλ‘ μ΄λ€.list
μ μ€λΈμ νΈλ€μ μ½λ‘ μΌλ‘ ꡬλΆνλ€. --inhibit-cache
-
/etc/ld.so.cache
λ₯Ό μ°μ§ μλλ€. --library-path path
- νκ²½ λ³μ
LD_LIBRARY_PATH
λμpath
λ₯Ό μ¬μ©νλ€. (μλ μ°Έκ³ .) μ΄λ¦ORIGIN
,LIB
,PLATFORM
μLD_LIBRARY_PATH
νκ²½ λ³μμμμ²λΌ ν΄μνλ€. --inhibit-rpath list
- RPATH λ° RUNPATH μ 보κ°
list
μ μ€λΈμ νΈ μ΄λ¦λ€ μ€ νλμ΄λ©΄ 무μνλ€. μμ μ€ν λͺ¨λ(μλ μ°Έκ³ )μμ λκ³ μμ λλ μ΄ μ΅μ μ 무μνλ€.list
μ μ€λΈμ νΈλ€μ μ½λ‘ μ΄λ 곡백μΌλ‘ ꡬλΆνλ€. --list
- λͺ¨λ μμ‘΄ κ΄κ³κ³Ό κ°κ°μ΄ μ΄λ»κ² ν΄κ²°λμλμ§λ₯Ό λμ΄νλ€.
-
--preload list
(glibc 2.30λΆν°) -
list
μ μ§μ ν μ€λΈμ νΈλ€μ μ¬μ μ μ¬νλ€.list
μ μ€λΈμ νΈλ€μ μ½λ‘ μ΄λ 곡백μΌλ‘ ꡬλΆνλ€. μλμLD_PRELOAD
νκ²½ λ³μ μ€λͺ μ²λΌ μ€λΈμ νΈλ€μ΄ μ¬μ μ μ¬λλ€.LD_PRELOAD
μ λ¬λ¦¬--preload
μ΅μ μμλ μ νλ‘κ·Έλ¨μ μ€ννλ μμ νλ‘μΈμ€μμ μνλλ μ¬μ μ μ¬μ μν₯μ λΌμΉμ§ μκ³ μ€ν νμΌ νλμλ§ μ¬μ μ μ¬λ₯Ό μνν μ μλ€. --verify
- νλ‘κ·Έλ¨μ΄ λμ μΌλ‘ λ§ν¬ λμ΄ μκ³ μ΄ λμ λ§μ»€μμ λ€λ£° μ μλμ§ νμΈνλ€.
λ€μν νκ²½ λ³μλ€μ΄ λμ λ§μ»€μ λμμ μν₯μ μ€λ€.
보μμ μ΄μ λλ¬Έμ λμ λ§μ»€μμ λ°μ΄λ리λ₯Ό μμ μ€ν(secure-execution) λͺ¨λλ‘ λλ €μΌ νλ€κ³ νλ¨ν κ²½μ°μλ μΌλΆ νκ²½ λ³μμ ν¨κ³Όκ° 무ν¨νλκ±°λ λ°λκ³ νκ²½μμ κ·Έ νκ²½ λ³μλ€μ΄ μ κ±°λΌμ νλ‘κ·Έλ¨μμλ κ·Έ μ μμ‘°μ°¨ λ³Ό μ μκ² λλ€. λμ λ§μ»€ μ체μ λμμ μν₯μ λΌμΉλ λͺ κ°μ§ νκ²½ λ³μλ₯Ό μλμμ μ€λͺ
νλ€. μ΄λ° μμΌλ‘ μ²λ¦¬λλ λ€λ₯Έ νκ²½ λ³μλ‘ GCONV_PATH
, GETCONF_DIR
, HOSTALIASES
, LOCALDOMAIN
, LOCPATH
, MALLOC_TRACE
, NIS_PATH
, NLSPATH
, RESOLV_HOST_CONF
, RES_OPTIONS
, TMPDIR
, TZDIR
λ±μ΄ μλ€.
보쑰 벑ν°(getauxval(3) μ°Έκ³ )μ AT_SECURE
νλͺ©μ΄ 0 μλ κ°μ κ°μ§κ³ μμΌλ©΄ λ°μ΄λ리λ₯Ό μμ μ€ν λͺ¨λλ‘ μ€ννλ€. μ¬λ¬ μ΄μ λ‘ κ·Έ νλͺ©μ΄ 0 μλ κ°μ κ°μ§ μ μλ€.
-
νλ‘μΈμ€μ μ€μ μ¬μ©μ IDμ μ€ν¨ μ¬μ©μ IDκ°, λλ μ€μ κ·Έλ£Ή IDμ μ€ν¨ κ·Έλ£Ή IDκ° λ€λ₯΄λ€. λ³΄ν΅ set-user-ID λ΄μ§ set-group-ID νλ‘κ·Έλ¨ μ€ν κ²°κ³Όλ‘ κ·Έλ κ² λλ€.
-
λ£¨νΈ μλ μ¬μ©μ IDμ νλ‘μΈμ€κ° μλ₯μ λΆμ¬ν΄ μ£Όλ λ°μ΄λ리λ₯Ό μ€ννλ€.
-
리λ μ€ λ³΄μ λͺ¨λ λλ¬Έμ 0 μλ κ°μ΄ μ€μ λμ μλ μλ€.
κ°μ₯ μ€μν νκ²½ λ³μλ€λ‘ λ€μμ΄ μλ€.
-
LD_ASSUME_KERNEL
(glibc 2.2.3λΆν°) -
κ° κ³΅μ μ€λΈμ νΈμμλ νμν μ΅μ 컀λ ABI λ²μ μ λμ λ§μ»€μκ² μλ € μ€ μ μλ€. (ELF note μΉμ μ μ΄ μκ±΄μ΄ λ€μ΄κ°λλ°
readelf -n
μ ν΅ν΄NT_GNU_ABI_TAG
λΌλ λ μ΄λΈμ μΉμ μΌλ‘ λ³Ό μ μλ€.) λ°νμμ λμ λ§μ»€κ° λκ³ μλ 컀λμ ABI λ²μ μ μμλ΄μ κ·Έ ABI λ²μ μ λλ μ΅μ ABI λ²μ μ μ§μ ν 곡μ μ€λΈμ νΈλ₯Ό μ μ¬νμ§ μκ² λλ€.LD_ASSUME_KERNEL
μ μ°λ©΄ λμ λ§μ»€μμ λ€λ₯Έ 컀λ ABI λ²μ μ μμ€ν μμ λκ³ μλ€κ³ μ¬κΈ°κ² λ§λ€ μ μλ€. μλ₯Ό λ€μ΄ λ€μ λͺ λ Ήνμmyprog
κ° νμλ‘ νλ 곡μ μ€λΈμ νΈλ€μ λμ λ§μ»€κ° μ μ¬ν λ 리λ μ€ 2.2.5 μμμ λκ³ μλ€κ³ μμ νλλ‘ νλ€.$ LD_ASSUME_KERNEL=2.2.5 ./myprog
κ°κΈ° μ΅μ 컀λ ABI λ²μ μκ±΄μ΄ λ€λ₯Έ μ¬λ¬ λ²μ μ 곡μ μ€λΈμ νΈλ₯Ό (νμ κ²½λ‘μ λ€λ₯Έ λλ ν°λ¦¬λ€μμ) μ 곡νλ μμ€ν μμλ
LD_ASSUME_KERNEL
μ μ΄μ©ν΄ (λλ ν°λ¦¬ νμ μμμ λ°λΌμ) μ¬μ©ν μ€λΈμ νΈ λ²μ μ μ νν μ μλ€.μμ¬μ μΌλ‘
LD_ASSUME_KERNEL
κΈ°λ₯μ κ°μ₯ ν° μ©λλ LinuxThreadsμ NPTLλ₯Ό λͺ¨λ μ 곡νλ μμ€ν μμ (κ·Έλ΄ λλ λ³΄ν΅ νμκ° κΈ°λ³ΈμΈλ°) λ ꡬμμΈ LinuxThreads POSIX μ€λ λ ꡬνμ μλμΌλ‘ μ ννλ κ²μ΄μλ€. pthreads(7) μ°Έκ³ . -
LD_BIND_NOW
(glibc 2.1.1λΆν°) -
λΉμ΄ μμ§ μμ λ¬Έμμ΄λ‘ μ€μ λΌ μμΌλ©΄ ν¨μ νΈμΆ κ²°μ μ 첫 μ°Έμ‘° μμ κΉμ§ λ―Έλ£¨μ§ μκ³ νλ‘κ·Έλ¨ μμ λ λμ λ§μ»€κ° λͺ¨λ μ¬λ³Όλ€μ κ²°μ νκ² νλ€. λλ²κ±° μ¬μ© μ μ μ©νλ€.
LD_LIBRARY_PATH
-
μ€ν μμ μ ELF λΌμ΄λΈλ¬λ¦¬λ€μ νμν λλ ν°λ¦¬λ€μ λͺ©λ‘. μ½λ‘ μ΄λ μΈλ―Έμ½λ‘ μΌλ‘ λͺ©λ‘ λ΄ νλͺ©λ€μ ꡬλΆνλλ° μ΄λ μͺ½ ꡬλΆμμλ μ΄μ€μΌμ΄ν μ§μμ μλ€.
μμ μ€ν λͺ¨λμμλ μ΄ λ³μλ₯Ό 무μνλ€.
λμ λ§μ»€λ
LD_LIBRARY_PATH
μ μ§μ λ κ²½λ‘λͺ μμ ν ν°$ORIGIN
,$LIB
,$PLATFORM
μ (λλ μ΄λ¦μ μ€κ΄νΈλ₯Ό λλ₯Έ λ²μ μ) μμ rpath ν ν° νμ₯μμ μ€λͺ ν κ²μ²λΌ νμ₯νλ€. κ·Έλμ μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ νλ©΄ μ€νν νλ‘κ·Έλ¨μ λ΄μ λλ ν°λ¦¬ μλμlib
λλlib64
μλΈλλ ν°λ¦¬μμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°Ύκ² λλ€.$ LD_LIBRARY_PATH='$ORIGIN/$LIB' prog
(μμλ°μ΄νλ₯Ό μ΄ κ²μ μ μνλΌ.
$ORIGIN
κ³Ό$LIB
κ° μ Έ λ³μλ‘ νμ₯λλ κ±Έ λ§κΈ° μν΄μμ΄λ€.) LD_PRELOAD
-
λ€λ₯Έ μ΄λ€ μ€λΈμ νΈλ³΄λ€ λ¨Όμ μΆκ°λ‘ μ μ¬ν μ¬μ©μ μ§μ ELF 곡μ μ€λΈμ νΈλ€μ λͺ©λ‘. μ΄ κΈ°λ₯μ μ΄μ©ν΄ λ€λ₯Έ 곡μ μ€λΈμ νΈμ ν¨μλ€μ μ νμ μΌλ‘ μ€λ²λΌμ΄λ ν μ μλ€.
곡백μ΄λ μ½λ‘ μΌλ‘ λͺ©λ‘ λ΄ νλͺ©λ€μ ꡬλΆνλλ° μ΄λ μͺ½ ꡬλΆμμλ μ΄μ€μΌμ΄ν μ§μμ μλ€. μ€λΈμ νΈ νμμ DESCRIPTIONμ κΈ°μ λ κ·μΉμ λ°λΌ μ΄λ€μ§λ€. λͺ©λ‘μ μ§μ ν μ’μμ μ°λ‘μ μμμ λ°λΌ μ€λΈμ νΈλ₯Ό νμν΄μ λ§ν¬ λ§΅μ μΆκ°νλ€.
μμ μ€ν λͺ¨λμμλ μ¬λμκ° ν¬ν¨λ μ¬μ μ μ¬ κ²½λ‘λͺ μ 무μνλ€. λν νμ€ νμ λλ ν°λ¦¬μ μλ κ²λ§, κ·Έλ¦¬κ³ set-user-ID λͺ¨λ λΉνΈκ° μΌμ Έ μλ (νμΉ μμ) κ²½μ°μλ§ κ³΅μ μ€λΈμ νΈλ₯Ό 미리 μ μ¬νλ€.
λμ λ§μ»€λ
LD_PRELOAD
λͺ©λ‘μ μ§μ λ μ΄λ¦μμ ν ν°$ORIGIN
,$LIB
,$PLATFORM
μ (λλ μ΄λ¦μ μ€κ΄νΈλ₯Ό λλ₯Έ λ²μ μ) μμ rpath ν ν° νμ₯μμ μ€λͺ ν κ²μ²λΌ μ²λ¦¬νλ€. (LD_LIBRARY_PATH
μ€λͺ μ λ°μ΄ν μ²λ¦¬ λ΄μ©λ μ°Έκ³ .)μ¬μ μ μ¬ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ§μ νλ λ°©λ²μ΄ μ¬λ¬ κ°μ§ μμΌλ©°, λ€μ μμλ‘ μ²λ¦¬λλ€.
(1)
LD_PRELOAD
νκ²½ λ³μ.(2) λμ λ§μ»€ μ§μ νΈμΆ μμ λͺ λ Ήν μ΅μ
--preload
.(3)
/etc/ld.so.preload
νμΌ. (μλμμ μ€λͺ ν¨.) LD_TRACE_LOADED_OBJECTS
-
(μ΄λ€ κ°μΌλ‘λ ) μ€μ λΌ μμΌλ©΄ νλ‘κ·Έλ¨μ΄ μ μ μ€ννλ λμ
ldd(1)
λ‘ μ€νν κ²μ²λΌ μκΈ°μ λμ μμ‘΄μ±μ λμ΄νκ² λλ€.
κ·Έλ¦¬κ³ μ’ λ μλ €μ§ λ³μλ€μ΄ μ¬λΏ μλλ°, λ€μλ ꡬμμ΄κ±°λ λ΄λΆμ©μ΄λ€.
-
LD_AUDIT
(glibc 2.4λΆν°) -
λ€λ₯Έ μ΄λ€ μ€λΈμ νΈλ³΄λ€ λ¨Όμ λ³λμ λ§μ»€ λ€μμ€νμ΄μ€μ μ μ¬ν (μ¦ νλ‘μΈμ€μμ μ΄λ€μ§ μ μμ μ¬λ³Ό κ²°μμ μΉ¨ν΄νμ§ μλλ€) μ¬μ©μ μ§μ ELF 곡μ μ€λΈμ νΈλ€μ λͺ©λ‘μ΄λ€. μ΄ μ€λΈμ νΈλ€μ μ΄μ©ν΄ λμ λ§μ»€μ λμμ κ°μ¬ν μ μλ€. 리μ€νΈμ νλͺ©λ€μ μ½λ‘ μΌλ‘ ꡬλΆνλ©° ꡬλΆμ μ΄μ€μΌμ΄ν μ§μμ΄ μλ€.
μμ μ€ν λͺ¨λμμλ
LD_AUDIT
μ 무μνλ€.μ΄λ₯Έλ° κ°μ¬ μ§μ λ€μμ (μλ₯Ό λ€μ΄ μ 곡μ μ€λΈμ νΈ μ μ¬ μ, μ¬λ³Ό κ²°μ μ, λ€λ₯Έ 곡μ μ€λΈμ νΈλ‘λΆν° μ¬λ³Ό νΈμΆ μ) λμ λ§μ»€κ° κ°μ¬ 곡μ μ€λΈμ νΈ λ΄μ μ μ ν ν¨μλ₯Ό νΈμΆνμ¬ μλ € μ£Όκ² λλ€. μμΈν λ΄μ©μ rtld-audit(7)μ 보λΌ. κ°μ¬ μΈν°νμ΄μ€κ° μλΌλ¦¬μ€μμ μ 곡νλ Linker and Libraries Guideμ Runtime Linker Auditing Interface μ₯μμ μ€λͺ νλ λ΄μ©κ³Ό μ λ°μ μΌλ‘ νΈνλλ€.
λμ λ§μ»€λ
LD_AUDIT
λͺ©λ‘μ μ§μ λ μ΄λ¦μμ ν ν°$ORIGIN
,$LIB
,$PLATFORM
μ (λλ μ΄λ¦μ μ€κ΄νΈλ₯Ό λλ₯Έ λ²μ μ) μμ rpath ν ν° νμ₯μμ μ€λͺ ν κ²μ²λΌ μ²λ¦¬νλ€. (LD_LIBRARY_PATH
μ€λͺ μ λ°μ΄ν μ²λ¦¬ λ΄μ©λ μ°Έκ³ .)glibc 2.13λΆν° μμ μ€ν λͺ¨λμμλ κ°μ¬ λͺ©λ‘μμ μ¬λμκ° ν¬ν¨λ μ΄λ¦μ 무μνλ©° νμ€ νμ λλ ν°λ¦¬μ μκ³ set-user-ID λΉνΈκ° μΌμ§ 곡μ μ€λΈμ νΈλ§ μ μ¬νλ€.
-
LD_BIND_NOT
(glibc 2.1.95λΆν°) -
μ΄ νκ²½ λ³μκ° λΉμ΄ μμ§ μμ λ¬Έμμ΄λ‘ μ€μ λΌ μμΌλ©΄ ν¨μ μ¬λ³Ό κ²°μ νμ GOT(global offset table)κ³Ό PLT(procedure linkage table)μ κ°±μ νμ§ μλλ€. μ΄ λ³μλ₯Ό
LD_DEBUG
(bindings
λ°symbols
λΆλ₯)μ ν¨κ» μ¬μ©νλ©΄ λͺ¨λ λ°νμ ν¨μ κ²°μμ κ΄μ°°ν μ μλ€. -
LD_DEBUG
(glibc 2.1λΆν°) -
λμ λ§μ»€μ λμμ λν μμΈν λλ²κΉ μ 보λ₯Ό μΆλ ₯νλ€. μ΄ λ³μμ λ΄μ©μ λ€μ λΆλ₯λ€μ νλ μ΄μ μ½λ‘ μ΄λ μ½ν, (κ°μ λ°μ΄νλ‘ κ°μΌ κ²½μ°) 곡백μΌλ‘ ꡬλΆν κ²μ΄λ€.
help
- μ΄ λ³μ κ°μ
help
λ₯Ό μ§μ νλ©΄ ν΄λΉ νλ‘κ·Έλ¨μ μ€ννμ§ μμΌλ©° μ΄ νκ²½ λ³μμ μ΄λ€ λΆλ₯λ€μ μ§μ ν μ μλμ§μ λν λμλ§ λ©μμ§λ₯Ό νμνλ€. all
- λͺ¨λ λλ²κΉ
μ 보λ₯Ό μ°λλ€. (
statistics
λ°unused
μ μΈ. μλ μ°Έκ³ .) bindings
- κ° μ¬λ³Όμ΄ μ΄λ μ μλ‘ κ²°μλλμ§μ λν μ 보λ₯Ό νμνλ€.
files
- μ λ ₯ νμΌ μ§ν μνλ₯Ό νμνλ€.
libs
- λΌμ΄λΈλ¬λ¦¬ νμ κ²½λ‘λ₯Ό νμνλ€.
reloc
- μ¬λ°°μΉ μ²λ¦¬λ₯Ό νμνλ€.
scopes
- μ€μ½ν μ 보λ₯Ό νμνλ€.
statistics
- μ¬λ°°μΉ ν΅κ³λ₯Ό νμνλ€.
symbols
- κ° μ¬λ³Ό κ²μμ λν΄ νμ κ²½λ‘λ₯Ό νμνλ€.
unused
- μ μ°μ΄λ DSOλ₯Ό μμλΈλ€.
versions
- λ²μ μμ‘΄μ±μ νμνλ€.
glibc 2.3.4λΆν° μμ μ€ν λͺ¨λμμλ
/etc/suid-debug
νμΌμ΄ μ‘΄μ¬νμ§ μλ ν (νμΌ λ΄μ©μ μκ΄μμ)LD_DEBUG
λ₯Ό 무μνλ€. -
LD_DEBUG_OUTPUT
(glibc 2.1λΆν°) -
κΈ°λ³Έμ μΌλ‘
LD_DEBUG
μΆλ ₯μ νμ€ μ€λ₯μ κΈ°λ‘νλ€.LD_DEBUG_OUTPUT
μ΄ μ μλΌ μμΌλ©΄ κ·Έ κ°μ "."(λ§μΉ¨ν)μ νλ‘μΈμ€ IDλ₯Ό λ§λΆμΈ κ²½λ‘λͺ μ μΆλ ₯μ κΈ°λ‘νλ€.μμ μ€ν λͺ¨λμμλ
LD_DEBUG_OUTPUT
μ 무μνλ€. -
LD_DYNAMIC_WEAK
(glibc 2.1.91λΆν°) -
κΈ°λ³Έμ μΌλ‘ 곡μ λΌμ΄λΈλ¬λ¦¬λ€μ μ°Ύμμ μ¬λ³Ό μ°Έμ‘°λ₯Ό κ²°μ ν λ λμ λ§μ»€μμλ μ²μ μ°Ύμ μ μλ‘ κ²°μ νκ² λλ€.
μμ glibc λ²μ λ€(2.2 μ )μμ μ 곡νλ λμμ λ¬λλ€. μ½ν μ¬λ³Όμ μ°ΎμΌλ©΄ λ§μ»€κ° κ·Έ μ¬λ³Όμ κΈ°μ΅ν΄ λκ³ λλ¨Έμ§ κ³΅μ λΌμ΄λΈλ¬λ¦¬λ€μμ κ³μ νμμ νλ€. μ΄ν λμΌ μ¬λ³Όμ λν κ°ν μ μλ₯Ό μ°Ύκ² λλ©΄ κ·Έ μ μλ₯Ό λμ μ¬μ©νλ€. (λλ μ¬λ³Όμ μ°Ύμ§ λͺ»νλ©΄ λμ λ§μ»€κ° μ²μ μ°Ύμλ μ½ν μ¬λ³Όμ μ¬μ©νλ€.)
μμ glibc λμ λ°©μμ λΉνμ€μ΄μλ€. (νμ€ λ°©μμμ μ½ν μ¬λ³Όκ³Ό κ°ν μ¬λ³Ό ꡬλ³μ΄ μ μ λ§ν¬ λλ§ ν¨λ ₯μ΄ μμ΄μΌ νλ€.) glibc 2.2μμ (λΉμ λ€λ₯Έ λλ€μ ꡬν체μμ μ 곡νλ λ°©μμ΄μλ) νμ¬μ λμ λ°©μμ μ 곡νλλ‘ λμ λ§μ»€κ° λ³κ²½λλ€.
LD_DYNAMIC_WEAK
λ³μλ₯Ό (μ΄λ€ κ°μΌλ‘λ ) μ€μ νλ©΄ μ΄λ€ 곡μ λΌμ΄λΈλ¬λ¦¬μ μ½ν μ¬λ³Όμ μ΄ν λ€λ₯Έ 곡μ λΌμ΄λΈλ¬λ¦¬μμ λ°κ²¬λ κ°ν μ¬λ³Όμ΄ μ€λ²λΌμ΄λ ν μ μλ μμ μ (λΉνμ€) glibc λμ λ°©μμ μ 곡νλ€. (μ°Έκ³ λ‘ μ΄ λ³μκ° μ€μ λΌ μλ κ²½μ°μλ 곡μ λΌμ΄λΈλ¬λ¦¬μ κ°ν μ¬λ³Όμ΄ λ©μΈ νλ‘κ·Έλ¨μ μλ λμΌ μ¬λ³Όμ μ½ν μ μλ₯Ό μ€λ²λΌμ΄λ νμ§λ μλλ€.)glibc 2.3.4λΆν° μμ μ€ν λͺ¨λμμλ
LD_DYNAMIC_WEAK
λ₯Ό 무μνλ€. -
LD_HWCAP_MASK
(glibc 2.1λΆν°) -
νλμ¨μ΄ λ₯λ ₯λ€μ λν λ§μ€ν¬.
-
LD_ORIGIN_PATH
(glibc 2.1λΆν°> -
λ°μ΄λ리λ₯Ό μ°Ύμ κ²½λ‘.
glibc 2.4λΆν° μμ μ€ν λͺ¨λμμλ
LD_ORIGIN_PATH
λ₯Ό 무μνλ€. -
LD_POINTER_GUARD
(glibc 2.4μμ 2.22κΉμ§) -
0μΌλ‘ μ€μ νλ©΄ ν¬μΈν° λ³΄νΈ κΈ°λ₯μ λλ€. κ·Έ μΈ λ€λ₯Έ κ°μ ν¬μΈν° λ³΄νΈ κΈ°λ₯μ μΌλ©°, μ΄κ² κΈ°λ³Έμ΄λ€. ν¬μΈν° λ³΄νΈ κΈ°λ₯μ΄λ μ°κΈ° κ°λ₯ν νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬μ μ μ₯λλ λͺλͺ μ½λ ν¬μΈν°λ€(setjmp(3)μμ μ μ₯νλ λ°ν μ£Όμλ μ¬λ¬ glibc λ΄λΆ ν¨μμμ μ°λ ν¨μ ν¬μΈν°λ€)μ λμμ κ°κΉκ² λ°κΏ λμ 곡격μκ° λ²νΌ μ€λ²λ° λ΄μ§ μ€ν λμΉ¨ 곡격 μ κ·Έ ν¬μΈν°λ€μ μ μ©νλ κ±Έ μ΄λ ΅κ² λ§λλ 보μ λ©μ»€λμ¦μ΄λ€. glibc 2.23λΆν°λ ν¬μΈν° λ³΄νΈ κΈ°λ₯μ΄ νμ μΌμ Έ μμΌλ―λ‘ λλ
LD_POINTER_GUARD
λ₯Ό μ¨μ κΈ°λ₯μ λ μ μλ€. -
LD_PROFILE
(glibc 2.1λΆν°) -
νλ‘νμΌ ν (λ¨μΌ) 곡μ μ€λΈμ νΈμ μ΄λ¦μ κ²½λ‘λͺ μ΄λ sonameμΌλ‘ μ§μ ν κ². "
$LD_PROFILE_OUTPUT
/$LD_PROFILE
.profile"μ΄λΌλ μ΄λ¦μ νμΌμ νλ‘νμΌλ§ μΆλ ₯μ΄ λ§λΆλλ€.glibc 2.2.5λΆν° μμ μ€ν λͺ¨λμμλ
LD_PROFILE
λ₯Ό 무μνλ€. -
LD_PROFILE_OUTPUT
(glibc 2.1λΆν°) -
LD_PROFILE
μΆλ ₯μ΄ κΈ°λ‘λλ λλ ν°λ¦¬. μ΄ λ³μκ° μ μλΌ μμ§ μκ±°λ λΉ λ¬Έμμ΄λ‘ μ μλΌ μλ κ²½μ° κΈ°λ³Έκ°μ/var/tmp
μ΄λ€.μμ μ€ν λͺ¨λμμλ
LD_PROFILE_OUTPUT
μ 무μνλ€. λμ νμ/var/profile
μ μ΄λ€. (μ΄ μ¬νμ glibc 2.2.5 μ μμλ§ μ ν¨νλ€. μ΄νμ glibc λ²μ λ€μμλ μμ μ€ν λͺ¨λμμLD_PROFILE
κΉμ§ 무μνλ€.) -
LD_SHOW_AUXV
(glibc 2.1λΆν°) -
μ΄ νκ²½ λ³μκ° (μ΄λ€ κ°μΌλ‘λ ) μ μλΌ μμΌλ©΄ 컀λλ‘λΆν° μ λ¬λ°μ 보쑰 λ°°μ΄(getauxval(3) μ°Έκ³ )μ λ³΄μ¬ μ€λ€.
glibc 2.3.4λΆν° μμ μ€ν λͺ¨λμμλ
LD_SHOW_AUXV
λ₯Ό 무μνλ€. -
LD_TRACE_PRELINKING
(glibc 2.4λΆν°) -
μ΄ νκ²½ λ³μκ° μ€μ λΌ μμΌλ©΄ μ΄ λ³μμ μ΄λ¦μ΄ ν λΉλΌ μλ μ€λΈμ νΈμ μ¬μ λ§ν¬ μ²λ¦¬λ₯Ό μΆμ νλ€. (
ldd(1)
λ₯Ό μ¨μ μΆμ κ°λ₯ν μ€λΈμ νΈλ€μ λͺ©λ‘μ μ»μ μ μλ€.) μ μ μλ μ€λΈμ νΈ μ΄λ¦μ΄λ©΄ λͺ¨λ μ¬μ λ§ν¬ μ²λ¦¬ νλμ μΆμ νλ€. -
LD_USE_LOAD_BIAS
(glibc 2.3.3λΆν°) -
κΈ°λ³Έμ μΌλ‘ (μ¦ μ΄ λ³μκ° μ μλΌ μμ§ μμΌλ©΄) μ€ν νμΌκ³Ό μ¬μ λ§ν¬ λ 곡μ μ€λΈμ νΈλ€μ μμ‘΄νλ 곡μ μ€λΈμ νΈμ κΈ°μ€ μ£Όμ(base address)λ₯Ό μ‘΄μ€νλ λ°λ©΄ (μ¬μ λ§ν¬ λΌ μμ§ μμ) μμΉ λ 립 μ€ν νμΌ(PIE)κ³Ό λ€λ₯Έ 곡μ μ€λΈμ νΈλ€μ μ‘΄μ€νμ§ μλλ€.
LD_USE_LOAD_BIAS
λ₯Ό κ°μ 1λ‘ ν΄μ μ¬μ©νλ©΄ μ€ν νμΌκ³Ό PIE λͺ¨λ κΈ°μ€ μ£Όμλ₯Ό μ‘΄μ€νκ² λλ€.LD_USE_LOAD_BIAS
κ° 0μΌλ‘ μ μλΌ μμΌλ©΄ μ€ν νμΌκ³Ό PIE μ΄λ μͺ½λ κΈ°μ€ μ£Όμλ₯Ό μ‘΄μ€νμ§ μκ² λλ€.glibc 2.3.3λΆν° μμ μ€ν λͺ¨λμμλ μ΄ λ³μλ₯Ό 무μνλ€.
-
LD_VERBOSE
(glibc 2.1λΆν°) -
λΉμ΄ μμ§ μμ λ¬Έμμ΄λ‘ μ€μ λΌ μμΌλ©΄
LD_TRACE_LOADED_OBJECTS
νκ²½ λ³μκ° μ€μ λΌ μμ λ νλ‘κ·Έλ¨μ λν μ¬λ³Ό λ²μ μ 보λ₯Ό μΆλ ₯νλ€. -
LD_WARN
(glibc 2.1.3λΆν°) -
λΉμ΄ μμ§ μμ λ¬Έμμ΄λ‘ μ€μ λΌ μμΌλ©΄ κ²°μ μ λ μ¬λ³Όλ€μ λν κ²½κ³ λ₯Ό νμνλ€.
-
LD_PREFER_MAP_32BIT_EXEC
(x86-64 μ μ©, glibc 2.23λΆν°) -
μΈν μ€λ²λͺ¬νΈ μννΈμ¨μ΄ μ΅μ ν μλ΄μμ λ°λ₯΄λ©΄ 64λΉνΈ μμ©μμ λΈλμΉμ λμμ΄ λΈλμΉμμ 4GB λκ² λ¨μ΄μ Έ μμΌλ©΄ λΈλμΉ μμΈ‘ μ±λ₯μ λΆμ μ μν₯μ΄ μμ μ μλ€. μ΄ νκ²½ λ³μκ° (μ΄λ€ κ°μΌλ‘λ ) μ€μ λΌ μμΌλ©΄ λμ λ§μ»€μμ λ¨Όμ mmap(2)
MAP_32BIT
νλκ·Έλ₯Ό μ¨μ μ€ν νμΌ νμ΄μ§ λ§€νμ μλνκ³ , μ€ν¨νλ©΄ κ·Έ νλκ·Έ μμ΄ λ§€ννκ² λλ€. μ£Όμ:MAP_32BIT
λ μ£Όμ κ³΅κ° νμ (4GBκ° μλ) 2GBλ‘ λ§€ν νλ€.MAP_32BIT
λ₯Ό μ°λ©΄ μ£Όμ κ³΅κ° λ°°μΉ λ¬΄μμν(ASLR)μ μΈ μ μλ μ£Όμ λ²μκ° μ€μ΄λ€κΈ° λλ¬Έμ μμ μ€ν λͺ¨λμμλ νμLD_PREFER_MAP_32BIT_EXEC
λ₯Ό λλ€.
/lib/ld.so
- a.out λμ λ§μ»€/λ‘λ
/lib/ld-linux.so.{1,2}
- ELF λμ λ§μ»€/λ‘λ
/etc/ld.so.cache
- 곡μ μ€λΈμ νΈλ₯Ό νμν λλ ν°λ¦¬λ€μ λͺ©λ‘κ³Ό ν보 곡μ μ€λΈμ νΈλ€μ μμ λͺ©λ‘μ λ΄μ νμΌ.
ldconfig(8)
μ°Έκ³ . /etc/ld.so.preload
- νλ‘κ·Έλ¨λ³΄λ€ λ¨Όμ μ μ¬ν ELF 곡μ μ€λΈμ νΈλ€μ 곡백 κ΅¬λΆ λͺ©λ‘μ λ΄μ νμΌ. μμ
LD_PRELOAD
μ€λͺ μ°Έκ³ .LD_PRELOAD
μ/etc/ld.so.preload
λ₯Ό λͺ¨λ μ¬μ©νλ©΄LD_PRELOAD
μ μ§μ ν λΌμ΄λΈλ¬λ¦¬λ€μ λ¨Όμ μ μ¬νλ€./etc/ld.so.preload
λ ν¨κ³Όκ° μμ€ν μ μμ΄μ΄μ μμ€ν μμ μ€νλλ λͺ¨λ νλ‘κ·Έλ¨μ λν΄ μ§μ ν λΌμ΄λΈλ¬λ¦¬λ€μ΄ μ¬μ μ μ¬λλ€. (μΌλ°μ μΌλ‘ μ΄λ λ°λμ§νμ§ μμΌλ©° 보ν΅μ κΈ΄κΈ μλ²μΌλ‘λ§ μ°μΈλ€. μλ₯Ό λ€μ΄ λΌμ΄λΈλ¬λ¦¬κ° μλͺ» ꡬμ±λμ λ μμ μ²μΉμ©μΌλ‘ μΈ μ μλ€.) lib*.so*
- 곡μ μ€λΈμ νΈ
μ΄λ€ 곡μ μ€λΈμ νΈλ€μ λͺ¨λ CPUμ μ‘΄μ¬νμ§λ μλ νλμ¨μ΄λ³ μΈμ€νΈλμ
μ μ΄μ©ν΄ μ»΄νμΌ λλ€. κ·Έλ° μ€λΈμ νΈλ€μ /usr/lib/sse2/
μ²λΌ νμν νλμ¨μ΄ λ₯λ ₯μ λνλ΄λ μ΄λ¦μ λλ ν°λ¦¬μ μ€μΉλΌμΌ νλ€. λμ λ§μ»€μμ κ·Έλ° λλ ν°λ¦¬λ€μ λ¨Έμ νλμ¨μ΄μ λ§λμ§ νμΈν΄μ ν΄λΉ 곡μ μ€λΈμ νΈμ κ°μ₯ μ μ ν λ²μ μ μ ννλ€. νλμ¨μ΄ λ₯λ ₯ λλ ν°λ¦¬λ€μ κ³μΈ΅μ μΌλ‘ λ§λ€μ΄μ CPU κΈ°λ₯λ€μ ν©μΉ μλ μλ€. μ§μνλ νλμ¨μ΄ λ₯λ ₯ μ΄λ¦μ λͺ©λ‘μ CPUμ λ°λΌ λ€λ₯΄λ€. νμ¬ λ€μ μ΄λ¦λ€μ μΈμνλ€.
- Alpha
- ev4, ev5, ev56, ev6, ev67
- MIPS
- loongson2e, loongson2f, octeon, octeon2
- PowerPC
- 4xxmac, altivec, arch_2_05, arch_2_06, booke, cellbe, dfp, efpdouble, efpsingle, fpu, ic_snoop, mmu, notb, pa6t, power4, power5, power5+, power6x, ppc32, ppc601, ppc64, smt, spe, ucache, vsx
- SPARC
- flush, muldiv, stbar, swap, ultra3, v9, v9v, v9v2
- s390
- dfp, eimm, esan3, etf3enh, g5, highgprs, hpage, ldisp, msa, stfle, z900, z990, z9-109, z10, zarch
- x86 (32λΉνΈ)
- acpi, apic, clflush, cmov, cx8, dts, fxsr, ht, i386, i486, i586, i686, mca, mmx, mtrr, pat, pbe, pge, pn, pse36, sep, ss, sse, sse2, tm
ld(1)
, ldd(1)
, pldd(1)
, sprof(1)
, dlopen(3), getauxval(3), elf(5), capabilities(7), rtld-audit(7), ldconfig(8)
, sln(8)
2019-08-02