rtld audit(7) - wariua/manpages-ko GitHub Wiki
rtld-audit - λμ λ§μ»€ κ°μ¬ API
#define _GNU_SOURCE /* feature_test_macros(7) μ°Έκ³ */
#include <link.h>
GNU λμ λ§μ»€(λ°νμ λ§μ»€)μμ κ°μ¬ APIλ₯Ό μ 곡νλλ° μ΄λ₯Ό ν΅ν΄ λ€μν λμ λ§ν¬ μ΄λ²€νΈ λ°μ μμ μμ©μμ μλ¦Όμ λ°μ μ μλ€. μ΄ APIλ μλΌλ¦¬μ€ λ°νμ λ§μ»€μμ μ 곡νλ κ°μ¬ μΈν°νμ΄μ€μ λ§€μ° λΉμ·νλ€. <link.h>
λ₯Ό ν¬ν¨μμΌμ νμν μμ λ° μνλ€μ μ μνλ€.
μ΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ €λ νλ‘κ·Έλλ¨Έλ νμ€ μ΄λ¦μ ν¨μλ€μ ꡬνν 곡μ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λ€κ² λλ€. λͺ¨λ ν¨μλ₯Ό ꡬνν΄μΌ νλ 건 μλλ€. λλΆλΆμ κ²½μ° νΉμ μ΄λ²€νΈ κ°μ¬ μ νμ λν΄ νλ‘κ·Έλλ¨Έκ° κ΄μ¬μ΄ μμΌλ©΄ λμνλ κ°μ¬ ν¨μ ꡬνμ μ 곡ν νμκ° μλ€.
κ°μ¬ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ €λ©΄ νκ²½ λ³μ LD_AUDIT
μ μ½€λ§λ‘ ꡬλΆλ 곡μ λΌμ΄λΈλ¬λ¦¬ λͺ©λ‘μ λ΄λλ‘ μ μν΄μΌ νλ€. κ·Έ λΌμ΄λΈλ¬λ¦¬λ€ κ°κ°μμ κ°μ¬ API(μ μΌλΆ)λ₯Ό ꡬνν μ μλ€. κ°μ¬ λμ μ΄λ²€νΈκ° λ°μνλ©΄ λΌμ΄λΈλ¬λ¦¬ λμ΄ μμ λλ‘ κ° λΌμ΄λΈλ¬λ¦¬μ λμ ν¨μκ° νΈμΆλλ€.
unsigned int la_version(unsigned int version);
κ°μ¬ λΌμ΄λΈλ¬λ¦¬μ κΌ μ μλΌ μμ΄μΌ νλ μ μΌν ν¨μμ΄λ©° λμ λ§μ»€μ κ°μ¬ λΌμ΄λΈλ¬λ¦¬ κ°μ 첫μΈμ¬λ₯Ό μννλ€. λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆν λ λ§μ»€μμ μ§μνλ κ°μ₯ λμ κ°μ¬ μΈν°νμ΄μ€ λ²μ μ version
μΌλ‘ μ λ¬νλ€. νμ μ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ μκΈ° μ건μ κ·Έ λ²μ μ΄ μΆ©λΆνμ§ νμΈν μ μλ€.
ν¨μ κ²°κ³Όλ‘ μ΄ ν¨μλ μ΄ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ μ¬μ©μ κΈ°λνλ κ°μ¬ μΈν°νμ΄μ€ λ²μ μ λ°νν΄μΌ νλ€. (version
μ λ°ννλ κ²λ κ°λ₯νλ€.) λ°ν κ°μ΄ 0μ΄κ±°λ λμ λ§μ»€κ° μ§μνλ κ²λ³΄λ€ ν° λ²μ μ΄λ©΄ κ·Έ κ°μ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό 무μνλ€.
char *la_objsearch(const char *name, uintptr_t *cookie,
unsigned int flag);
λμ λ§μ»€μμ μ΄ ν¨μλ₯Ό νΈμΆν΄μ 곡μ μ€λΈμ νΈ νμμ νλ € νλ€λ κ±Έ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μκ² μλ¦°λ€. name
μΈμλ νμν νμΌλͺ
μ΄λ κ²½λ‘λͺ
μ΄λ€. cookie
λ νμμ μ λ°ν 곡μ μ€λΈμ νΈλ₯Ό μλ³ν μ μκ² ν΄ μ€λ€. flag
λ λ€μ κ°λ€ μ€ νλλ‘ μ€μ λΌ μλ€.
LA_SER_ORIG
-
name
μ΄ νμνλ €λ μλ μ΄λ¦μ΄λ€. λ³΄ν΅ ELFDT_NEEDED
νλͺ©μμ μ¨ μ΄λ¦μ΄κ±°λ[[dlopen(3)]]μ
filename
μΈμμ΄λ€. LA_SER_LIBPATH
-
LD_LIBRARY_PATH
μ μ§μ λ λλ ν°λ¦¬λ₯Ό μ΄μ©ν΄name
μ λ§λ€μλ€. LA_SER_RUNPATH
- ELF
DT_RPATH
λ΄μ§DT_RUNPATH
λͺ©λ‘μ μ§μ λ λλ ν°λ¦¬λ₯Ό μ΄μ©ν΄name
μ λ§λ€μλ€. LA_SER_CONFIG
-
ldconfig(8)
μΊμ(/etc/ld.so.cache
)λ₯Ό ν΅ν΄name
μ μ°Ύμλ€. LA_SER_DEFAULT
- κΈ°λ³Έ λλ ν°λ¦¬λ€ μ€ νλλ₯Ό νμν΄μ
name
μ μ°Ύμλ€. LA_SER_SECURE
-
name
μ΄ λ³΄μ μ€λΈμ νΈλ‘ νμ λΌ μλ€. (리λ μ€μμλ μ°μ§ μμ.)
ν¨μ κ²°κ³Όλ‘ la_objsearch()
λ λμ λ§μ»€κ° μ΄ν μ²λ¦¬μ μ¬μ©ν΄μΌ ν κ²½λ‘λͺ
μ λ°ννλ€. NULLμ λ°ννλ©΄ μ΄ κ²½λ‘λͺ
μ μ΄ν μ²λ¦¬μμ 무μνλ€. κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ νμ κ²½λ‘λ₯Ό κ°μλ§ νλ €λ κ±°λΌλ©΄ name
μ λ°ννλ©΄ λλ€.
void la_activity(uintptr_t *cookie, unsigned int flag);
λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆν΄μ λ§ν¬ λ§΅ λμμ΄ μμ΄λκ³ μλ€λ κ±Έ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μκ² μλ¦°λ€. cookie
λ λ§ν¬ λ§΅μ 머리μ μλ μ€λΈμ νΈλ₯Ό μλ³ν μ μκ² ν΄ μ€λ€. λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆν λ flag
λ₯Ό λ€μ κ°λ€ μ€ νλλ‘ μ€μ νλ€.
LA_ACT_ADD
- λ§ν¬ λ§΅μ μ μ€λΈμ νΈλ€μ μΆκ°νλ € νλ€.
LA_ACT_DELETE
- λ§ν¬ λ§΅μμ μ€λΈμ νΈλ€μ μ κ±°νλ € νλ€.
LA_ACT_CONSISTENT
- λ§ν¬ λ§΅ λμμ΄ λλ¬λ€. λ§΅μ΄ λ€μ λͺ¨μ μλ μνμ΄λ€.
unsigned int la_objopen(struct link_map *map, Lmid_t lmid,
uintptr_t *cookie);
μ 곡μ μ€λΈμ νΈλ₯Ό μ μ¬ν λ λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆνλ€. map
μΈμλ κ·Έ μ€λΈμ νΈλ₯Ό κΈ°μ νλ λ§ν¬ λ§΅ ꡬ쑰체μ λν ν¬μΈν°μ΄λ€. lmid
μΈμλ λ€μ κ°λ€ μ€ νλμ΄λ€.
LM_ID_BASE
- λ§ν¬ λ§΅μ΄ μ΅μ΄ λ€μμ€νμ΄μ€μ μνλ€.
LM_ID_NEWLM
- λ§ν¬ λ§΅μ΄ dlmopen(3)μ ν΅ν΄ μμ²λ μ λ€μμ€νμ΄μ€μ μνλ€.
cookie
λ μ΄ μ€λΈμ νΈμ μλ³μμ λν ν¬μΈν°μ΄λ€. μ΄νμ κ°μ¬ λΌμ΄λΈλ¬λ¦¬ ν¨μ νΈμΆμ μ΄ μλ³μκ° μ 곡λλ―λ‘ μ΄ μ€λΈμ νΈλ₯Ό μλ³ν μ μλ€. μ΄ μλ³μλ μ€λΈμ νΈμ λ§ν¬ λ§΅μ κ°λ¦¬ν€λλ‘ μ΄κΈ°ν λΌ μμ§λ§ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ μ€λΈμ νΈ μλ³μ μ°κΈ° νΈν λ€λ₯Έ μ΄λ€ κ°μΌλ‘ λ°κΏ μ μλ€.
λ°ν κ°μΌλ‘ la_objopen()
μ λ€μ μμλ€μ 0κ° μ΄μ OR ν΄μ λ§λ λΉνΈ λ§μ€ν¬λ₯Ό λ°ννλ€. κ·Έλμ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ la_symbind*()
λ‘ κ°μν μ€λΈμ νΈλ₯Ό μ νν μ μλ€.
LA_FLG_BINDTO
- μ΄ μ€λΈμ νΈλ‘μ μ¬λ³Ό λ°μΈλ©μ κ°μ¬νλ€.
LA_FLG_BINDFROM
- μ΄ μ€λΈμ νΈλ‘λΆν°μ μ¬λ³Ό λ°μΈλ©μ κ°μ¬νλ€.
la_objopen()
μ λ°ν κ° 0μ μ΄ μ€λΈμ νΈμ λν΄ μ΄λ€ μ¬λ³Ό λ°μΈλ©λ κ°μ¬νμ§ μμ κ²μμ λνλΈλ€.
unsinged int la_objclose(uintptr_t *cookie);
μ€λΈμ νΈμ λ§λ¬΄λ¦¬ μ½λκ° μμΌλ©΄ μ€νν νμ΄λ©΄μ κ·Έ μ€λΈμ νΈλ₯Ό λ΄λ¦¬κΈ°λ μ μ λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆνλ€. cookie
μΈμλ μμ la_objopen()
νΈμΆμμ μ»μ μλ³μμ΄λ€.
νμ¬ κ΅¬νμμλ la_objclose()
κ° λ°ννλ κ°μ 무μνλ€.
void la_preinit(uintptr_t *cookie);
λͺ¨λ 곡μ μ€λΈμ νΈλ€μ μ μ¬ν νμ΄λ©΄μ μμ©μΌλ‘ μ μ΄λ₯Ό λκΈ°κΈ°λ μ μ (μ¦ main()
νΈμΆ μ μ) λμ λ§μ»€κ° μ΄ ν¨μλ₯Ό νΈμΆνλ€. μ°Έκ³ λ‘ μ΄ν main()
μμλ dlopen(3)μΌλ‘ μ€λΈμ νΈλ₯Ό λμ μΌλ‘ μ μ¬ν μ μλ€.
uintptr_t la_symbind32(Elf32_Sym *sym, unsigned int ndx,
uintptr_t *refcook, uintptr_t *defcook,
unsigned int *flags, const char *symname);
uintptr_t la_symbind64(Elf64_Sym *sym, unsigned int ndx,
uintptr_t *refcook, uintptr_t *defcook,
unsigned int *flags, const char *symname);
la_objopen()
μμ κ°μ¬ μλ¦Όμ λ°κ² νμνλ λ 곡μ μ€λΈμ νΈ κ°μ μ¬λ³Ό λ°μΈλ©μ΄ μ΄λ€μ§ λ λμ λ§μ»€κ° μ΄ ν¨μλ€ μ€ νλλ₯Ό νΈμΆνλ€. la_symbind32()
ν¨μλ 32λΉνΈ νλ«νΌμμ μ°λ κ²μ΄κ³ la_symbind64()
ν¨μλ 64λΉνΈ νλ«νΌμμ μ°λ κ²μ΄λ€.
sym
μΈμλ λ°μΈλ νλ €λ μ¬λ³Όμ λν μ 보λ₯Ό μ 곡νλ ꡬ쑰체μ λν ν¬μΈν°μ΄λ€. ꡬ쑰체 μ μλ <elf.h>
μ μλ€. μ΄ κ΅¬μ‘°μ²΄μ νλλ€ μ€μ st_value
μ μ¬λ³Όμ΄ λ°μΈλ λλ μ£Όμλ₯Ό λνλΈλ€.
ndx
μΈμλ λ°μΈλ λμ 곡μ μ€λΈμ νΈμ μ¬λ³Ό ν
μ΄λΈμμ κ·Έ μ¬λ³Όμ μΈλ±μ€μ΄λ€.
refcook
μΈμλ μ¬λ³Ό μ°Έμ‘°λ₯Ό νκ³ μλ 곡μ μ€λΈμ νΈλ₯Ό λνλΈλ€. LA_FLG_BINDFROM
μ λ°νν la_objopen()
ν¨μμ μ 곡λ κ²κ³Ό κ°μ μλ³μμ΄λ€. defcook
μΈμλ μ°Έμ‘°λλ μ¬λ³Όμ μ μνκ³ μλ 곡μ μ€λΈμ νΈλ₯Ό λνλΈλ€. LA_FLG_BINDTO
λ₯Ό λ°νν la_objopen()
ν¨μμ μ 곡λ κ²κ³Ό κ°μ μλ³μμ΄λ€.
symname
μΈμλ μ¬λ³Ό μ΄λ¦μ λ΄μ λ¬Έμμ΄μ κ°λ¦¬ν¨λ€.
flags
μΈμλ μ¬λ³Όμ λν μ 보λ₯Ό μ 곡νλ©΄μ λμμ μ΄ PLT(Procedure Linkage Table) νλͺ©μ μ΄ν κ°μ¬ λ°©μμ λ³κ²½νλ λ° μΈ μ μλ λΉνΈ λ§μ€ν¬μ΄λ€. λμ λ§μ»€κ° μ΄ μΈμμ λ€μ λΉνΈ κ°λ€μ μ 곡ν μ μλ€.
LA_SYMB_DLSYM
- dlsym(3) νΈμΆλ‘ μΈν΄ λ°μΈλ©μ΄ λ°μνλ€.
LA_SYMB_ALTVALUE
- μμ
la_symbind*()
νΈμΆμ΄ μ΄ μ¬λ³Όμ λν΄ λ체 κ°μ λ°ννλ€.
κΈ°λ³Έμ μΌλ‘ κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ la_pltenter()
λ° la_pltexit()
ν¨μ(μλ μ°Έκ³ )λ₯Ό ꡬννκ³ μμΌλ©΄ la_symbind()
νμ μ¬λ³Όμ΄ μ°Έμ‘°λ λλ§λ€ PLT νλͺ©μ λν΄ κ·Έ ν¨μλ€μ΄ νΈμΆλλ€. *flags
μ λ€μ νλκ·Έλ€μ OR ν΄μ κ·Έ κΈ°λ³Έ λμμ λ°κΏ μ μλ€.
LA_SYMB_NOPLTENTER
- μ΄ μ¬λ³Όμ
la_pltenter()
λ₯Ό νΈμΆνμ§ λ§ κ². LA_SYMB_NOPLTEXIT
- μ΄ μ¬λ³Όμ
la_pltexit()
μ νΈμΆνμ§ λ§ κ².
la_symbind32()
λ° la_symbind64()
μ λ°ν κ°μ ν¨μ λ°ν ν μ μ΄κ° λμ΄κ°μΌ ν μ£Όμμ΄λ€. κ°μ¬ λΌμ΄λΈλ¬λ¦¬μμ μ¬λ³Ό λ°μΈλ©μ κ°μλ§ νλ €λ κ±°λΌλ©΄ sym->st_value
λ₯Ό λ°ννλ©΄ λλ€. λΌμ΄λΈλ¬λ¦¬μμ μ μ΄λ₯Ό λ€λ₯Έ λ°©ν₯μΌλ‘ λ°κΎΈκ³ μΆλ€λ©΄ λ€λ₯Έ κ°μ λ°νν μ μλ€.
μ΄ ν¨μμ μ νν μ΄λ¦κ³Ό μΈμ νμ
μ νλμ¨μ΄ νλ«νΌμ λ°λΌ λ€λ₯΄λ€. (<link.h>
μ μ μ ν μ μκ° μλ€.) λ€μμ x86-32μ© μ μμ΄λ€.
Elf32_Addr la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx,
uintptr_t *refcook, uintptr_t *defcook,
La_i86_regs *regs, unsigned int *flags,
const char *symname, long int *framesizep);
λ°μΈλ© μλ¦Όμ λ°κ² νμλ λ 곡μ μ€λΈμ νΈ κ°μμ PLT νλͺ©μ΄ νΈμΆλκΈ° λ°λ‘ μ μ μ΄ ν¨μκ° νΈμΆλλ€.
sym
, ndx
, refcook
, defcook
, symname
μ la_symbind*()
μμμ κ°λ€.
regs
μΈμλ μ΄ PLT νλͺ© νΈμΆμ μ¬μ©λ λ μ§μ€ν°λ€μ κ°μ λ΄μ ꡬ쑰체(<link.h>
μ μ μλΌ μμ)λ₯Ό κ°λ¦¬ν¨λ€.
flags
μΈμλ la_symbind*()
μμμ²λΌ μ΄ PLT νλͺ©μ λν μ 보λ₯Ό λ΄κ³ μκ³ μ΄ν κ°μ¬ λ°©μ λ³κ²½μ μ΄μ©ν μ μλ λΉνΈ λ§μ€ν¬λ₯Ό κ°λ¦¬ν¨λ€.
framesizep
μΈμλ long int
λ²νΌλ₯Ό κ°λ¦¬ν€λλ° μ΄λ₯Ό μ΄μ©ν΄ μ΄ PLT νλͺ© νΈμΆμ μ¬μ©νλ νλ μ ν¬κΈ°λ₯Ό λͺ
νν μ€μ ν μ μλ€. μ΄ μ¬λ³Όμ λν΄ μ¬λ¬ la_pltenter()
μμ λ€λ₯Έ κ°λ€μ λ°ννλ©΄ κ°μ₯ ν° λ°ν κ°μ μ΄λ€. μ΄ λ²νΌκ° λͺ
ννκ² μ μ ν κ°μΌλ‘ μ€μ λ κ²½μ°μλ§ la_pltexit()
ν¨μκ° νΈμΆλλ€.
la_pltenter()
μ λ°ν κ°μ la_symbind*()
μμμ κ°λ€.
μ΄ ν¨μμ μ νν μ΄λ¦κ³Ό μΈμ νμ
μ νλμ¨μ΄ νλ«νΌμ λ°λΌ λ€λ₯΄λ€. (<link.h>
μ μ μ ν μ μκ° μλ€.) λ€μμ x86-32μ© μ μμ΄λ€.
unsigned int la_i86_gnu_pltexit(Elf32_Sym *sym, unsigned int ndx,
uintptr_t *refcook, uintptr_t *defcook,
const La_i86_regs *inregs, La_i86_retval *outregs,
const char *symname);
λ°μΈλ© μλ¦Όμ λ°κ² νμλ λ 곡μ μ€λΈμ νΈ κ°μμ PLT νλͺ©μ΄ λ°νν λ μ΄ ν¨μκ° νΈμΆλλ€. PLT νλͺ© νΈμΆμμκ² μ μ΄κ° λμκ°κΈ° λ°λ‘ μ μ ν¨μκ° νΈμΆλλ€.
sym
, ndx
, refcook
, defcook
, symname
μ la_symbind*()
μμμ κ°λ€.
inregs
μΈμλ μ΄ PLT νλͺ© νΈμΆμ μ¬μ©λ λ μ§μ€ν°λ€μ κ°μ λ΄μ ꡬ쑰체(<link.h>
μ μ μλΌ μμ)λ₯Ό κ°λ¦¬ν¨λ€. outregs
μΈμλ μ΄ PLT νλͺ© νΈμΆμ λ°ν κ°μ λ΄μ ꡬ쑰체(<link.h>
μ μ μλΌ μμ)λ₯Ό κ°λ¦¬ν¨λ€. μ΄ κ°λ€μ νΈμΆμκ° λ³κ²½ν μ μμΌλ©° κ·Έ λ³κ²½ λ΄μ©μ΄ PLT νλͺ© νΈμΆμμκ² λ³΄μ΄κ² λλ€.
νμ¬ GNU ꡬνμμλ la_pltexit()
μ λ°ν κ°μ 무μνλ€.
μ΄ APIλ λΉνμ€μ΄λ μλΌλ¦¬μ€ Linker and Libraries Guideμ Runtime Linker Auditing Interface μ₯μ κΈ°μ λ μλΌλ¦¬μ€ APIμ λ§€μ° λΉμ·νλ€.
μλΌλ¦¬μ€ λμ λ§μ»€ κ°μ¬ APIμμ λ€μ μ°¨μ΄μ μ μνλΌ.
-
μλΌλ¦¬μ€μ
la_objfilter()
μΈν°νμ΄μ€λ₯Ό GNU ꡬνμμλ μ§μνμ§ μλλ€. -
μλΌλ¦¬μ€μ
la_symbind32()
λ°la_pltexit()
ν¨μμλsymname
μΈμκ° μλ€. -
μλΌλ¦¬μ€μ
la_pltexit()
ν¨μμλinregs
λ°outregs
μΈμκ° μλ€. (νμ§λ§regval
μΈμλ‘ ν¨μ λ°ν κ°μ μ 곡νλ€.)
glibc λ²μ 2.9κΉμ§μμ LD_AUDIT
μ κ°μ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬λ¬ κ° μ§μ νλ©΄ λ°νμ ν¬λμκ° λ°μνλ€. glibc 2.10μμ κ³ μ³μ‘λ€κ³ νλ€.
#include <link.h>
#include <stdio.h>
unsigned int
la_version(unsigned int version)
{
printf("la_version(): %d\n", version);
return version;
}
char *
la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag)
{
printf("la_objsearch(): name = %s; cookie = %p", name, cookie);
printf("; flag = %s\n",
(flag == LA_SER_ORIG) ? "LA_SER_ORIG" :
(flag == LA_SER_LIBPATH) ? "LA_SER_LIBPATH" :
(flag == LA_SER_RUNPATH) ? "LA_SER_RUNPATH" :
(flag == LA_SER_DEFAULT) ? "LA_SER_DEFAULT" :
(flag == LA_SER_CONFIG) ? "LA_SER_CONFIG" :
(flag == LA_SER_SECURE) ? "LA_SER_SECURE" :
"???");
return name;
}
void
la_activity (uintptr_t *cookie, unsigned int flag)
{
printf("la_activity(): cookie = %p; flag = %s\n", cookie,
(flag == LA_ACT_CONSISTENT) ? "LA_ACT_CONSISTENT" :
(flag == LA_ACT_ADD) ? "LA_ACT_ADD" :
(flag == LA_ACT_DELETE) ? "LA_ACT_DELETE" :
"???");
}
unsigned int
la_objopen(struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
{
printf("la_objopen(): loading \"%s\"; lmid = %s; cookie=%p\n",
map->l_name,
(lmid == LM_ID_BASE) ? "LM_ID_BASE" :
(lmid == LM_ID_NEWLM) ? "LM_ID_NEWLM" :
"???",
cookie);
return LA_FLG_BINDTO | LA_FLG_BINDFROM;
}
unsigned int
la_objclose (uintptr_t *cookie)
{
printf("la_objclose(): %p\n", cookie);
return 0;
}
void
la_preinit(uintptr_t *cookie)
{
printf("la_preinit(): %p\n", cookie);
}
uintptr_t
la_symbind32(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
uintptr_t *defcook, unsigned int *flags, const char *symname)
{
printf("la_symbind32(): symname = %s; sym->st_value = %p\n",
symname, sym->st_value);
printf(" ndx = %d; flags = 0x%x", ndx, *flags);
printf("; refcook = %p; defcook = %p\n", refcook, defcook);
return sym->st_value;
}
uintptr_t
la_symbind64(Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
uintptr_t *defcook, unsigned int *flags, const char *symname)
{
printf("la_symbind64(): symname = %s; sym->st_value = %p\n",
symname, sym->st_value);
printf(" ndx = %d; flags = 0x%x", ndx, *flags);
printf("; refcook = %p; defcook = %p\n", refcook, defcook);
return sym->st_value;
}
Elf32_Addr
la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx,
uintptr_t *refcook, uintptr_t *defcook, La_i86_regs *regs,
unsigned int *flags, const char *symname, long int *framesizep)
{
printf("la_i86_gnu_pltenter(): %s (%p)\n", symname, sym->st_value);
return sym->st_value;
}
ldd(1)
, dlopen(3), ld.so(8), ldconfig(8)
2019-03-06