ld.so(8) - wariua/manpages-ko GitHub Wiki

NAME

ld.so, ld-linux.so - 동적 링컀/λ‘œλ”

SYNOPSIS

μ–΄λ–€ 동적 링크 된 ν”„λ‘œκ·Έλž¨ λ‚΄μ§€ 곡유 였브젝트λ₯Ό μ‹€ν–‰ν•¨μœΌλ‘œμ¨ 동적 링컀λ₯Ό κ°„μ ‘μ μœΌλ‘œ μ‹€ν–‰ν•  μˆ˜λ„ 있고 (이 경우 동적 링컀에 λͺ…λ Ήν–‰ μ˜΅μ…˜μ„ 쀄 수 μ—†μœΌλ©°, ELF인 경우 ν”„λ‘œκ·Έλž¨μ˜ .interp μ„Ήμ…˜μ— μ €μž₯된 동적 링컀λ₯Ό μ‹€ν–‰ν•œλ‹€.) λ‹€μŒμ²˜λŸΌ 직접 μ‹€ν–‰ν•  μˆ˜λ„ μžˆλ‹€.

/lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]

DESCRIPTION

ν”„λ‘œκ·Έλž¨ 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 토큰 ν™•μž₯

동적 λ§μ»€λŠ” 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μ—μ„œ 이 λ¬Έμžμ—΄ 값을 κ°€μ Έμ˜¨λ‹€.

OPTIONS

--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
ν”„λ‘œκ·Έλž¨μ΄ λ™μ μœΌλ‘œ 링크 λ˜μ–΄ 있고 이 동적 λ§μ»€μ—μ„œ λ‹€λ£° 수 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

ENVIRONMENT

λ‹€μ–‘ν•œ ν™˜κ²½ λ³€μˆ˜λ“€μ΄ 동적 링컀의 λ™μž‘μ— 영ν–₯을 μ€€λ‹€.

μ•ˆμ „ μ‹€ν–‰ λͺ¨λ“œ

λ³΄μ•ˆμƒ 이유 λ•Œλ¬Έμ— 동적 λ§μ»€μ—μ„œ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ•ˆμ „ μ‹€ν–‰(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λ₯Ό λˆλ‹€.

FILES

/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*
곡유 였브젝트

NOTES

ν•˜λ“œμ›¨μ–΄ ν˜Έν™˜μ„±

μ–΄λ–€ 곡유 μ˜€λΈŒμ νŠΈλ“€μ€ λͺ¨λ“  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

SEE ALSO

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

⚠️ **GitHub.com Fallback** ⚠️