Man page - rtld-audit(7)

Packages contains this manual

Available languages:

en fr ru

Manual

RTLD-AUDIT

ΠΠΠ˜ΠœΠ•ΠΠžΠ’ΠΠΠ˜Π•
ΠžΠ‘Π—ΠžΠ 
ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•
la_version()
la_objsearch()
la_activity()
la_objopen()
la_objclose()
la_preinit()
la_symbind*()
la_pltenter()
la_pltexit()
Π’Π•Π Π‘Π˜Π˜
БВАНДАРВЫ
ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π―
ΠžΠ¨Π˜Π‘ΠšΠ˜
ΠŸΠ Π˜ΠœΠ•Π Π«
Π‘ΠœΠžΠ’Π Π˜Π’Π• Π’ΠΠšΠ–Π•
ΠŸΠ•Π Π•Π’ΠžΠ”

ΠΠΠ˜ΠœΠ•ΠΠžΠ’ΠΠΠ˜Π•

rtld-audit - ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс слСТСния Π·Π° динамичСским ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ

ΠžΠ‘Π—ΠžΠ 

#define _GNU_SOURCE /* смотритС feature_test_macros(7) */
#include <link.h>

ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ GNU (ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния) прСдоставляСт API слСТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событиях динамичСской ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π”Π°Π½Π½Ρ‹ΠΉ API ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° интСрфСйс слСТСния, прСдоставляСмый ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈΠ· Solaris. НСобходимыС константы ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² <link.h> .

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот интСрфСйс, программист создаёт ΠΎΠ±Ρ‰ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ со стандартизованными ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. НС всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ: Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, Ссли программист Π½Π΅ заинтСрСсован Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ классС отслСТиваСмых событий, Ρ‚ΠΎ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ Π² создании ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Для примСнСния интСрфСйса слСТСния пСрСмСнная окруТСния LD_AUDIT Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ двоСточиями список ΠΎΠ±Ρ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ (частично) API слСТСния. Когда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ отслСТиваСмоС событиС, ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ вызываСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ функция Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±Ρ‹Π»ΠΈ пСрСчислСны.

la_version()

unsigned int la_version(unsigned int version );

This is the only function that must be defined by an auditing library: it performs the initial handshake between the dynamic linker and the auditing library. When invoking this function, the dynamic linker passes, in version , the highest version of the auditing interface that the linker supports.

A typical implementation of this function simply returns the constant LAV_CURRENT , which indicates the version of <link.h> that was used to build the audit module. If the dynamic linker does not support this version of the audit interface, it will refuse to activate this audit module. If the function returns zero, the dynamic linker also does not activate this audit module.

In order to enable backwards compatibility with older dynamic linkers, an audit module can examine the version argument and return an earlier version than LAV_CURRENT , assuming the module can adjust its implementation to match the requirements of the previous version of the audit interface. The la_version function should not return the value of version without further checks because it could correspond to an interface that does not match the <link.h> definitions used to build the audit module.

la_objsearch()

char *la_objsearch(const char * name , uintptr_t * cookie ,
unsigned int
flag );

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для информирования ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΡ€ΠΈ поискС ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. АргумСнт name содСрТит имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π’ cookie указываСтся ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ‡Π°Π» поиск. АргумСнт flag устанавливаСтся Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

LA_SER_ORIG

Π­Ρ‚ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это имя хранится Π² записи ELF DT_NEEDED ΠΈΠ»ΠΈ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ filename ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ dlopen (3).

LA_SER_LIBPATH

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ name Π±Ρ‹Π»ΠΎ создано с использованиСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ· LD_LIBRARY_PATH .

LA_SER_RUNPATH

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ name Π±Ρ‹Π»ΠΎ создано с использованиСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ· списка ELF DT_RPATH ΠΈΠ»ΠΈ DT_RUNPATH .

LA_SER_CONFIG

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ name Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² кэшС ldconfig (8) ( /etc/ld.so.cache ).

LA_SER_DEFAULT

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ name Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΏΡ€ΠΈ поискС Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

LA_SER_SECURE

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ name относится ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ бСзопасности (Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Linux).

Ѐункция la_objsearch () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ динамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Π΅. Если возвращаСтся NULL, Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ игнорируСтся Π² дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Π΅. Если данная ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° создана для простого слСТСния Π·Π° путями поиска, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ name .

la_activity()

void la_activity( uintptr_t * cookie , unsigned int flag );

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для информирования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ слСТСния ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ дСйствия с ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ ссылок (link-map). Π’ cookie задаётся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, находящийся Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹ ссылок. Когда динамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ flag устанавливаСтся Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

LA_ACT_ADD

Π’ ΠΊΠ°Ρ€Ρ‚Ρƒ ссылок добавляСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

LA_ACT_DELETE

Из ΠΊΠ°Ρ€Ρ‚Ρ‹ ссылок удаляСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

LA_ACT_CONSISTENT

ДСйствиС с ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ ссылок Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ: ΠΊΠ°Ρ€Ρ‚Π° снова ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π° (consistent).

la_objopen()

unsigned int la_objopen(struct link_map * map , Lmid_t lmid ,
uintptr_t *
cookie );

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. АргумСнт map являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° структуру ΠΊΠ°Ρ€Ρ‚Ρ‹ ссылок (link-map), которая описываСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ПолС lmid устанавливаСтся Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

LM_ID_BASE

ΠšΠ°Ρ€Ρ‚Π° ссылок являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ (namespace).

LM_ID_NEWLM

ΠšΠ°Ρ€Ρ‚Π° ссылок являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½, Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‡Π΅Ρ€Π΅Π· dlmopen (3).

АргумСнт cookie β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π”Π°Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ инициализируСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΊΠ°Ρ€Ρ‚Ρƒ ссылок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΅ΠΉ ΡƒΠ΄ΠΎΠ±Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обращСния ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

Ѐункция la_objopen () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску, созданноС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ слоТСния (OR) нуля ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· la_symbind* ():

LA_FLG_BINDTO

Π‘Π»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ привязками этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

LA_FLG_BINDFROM

Π‘Π»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ привязками ΠΈΠ· этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΠΈΠ· la_objopen () ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ привязки этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

la_objclose()

unsigned int la_objclose(uintptr_t * cookie );

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ послС выполнСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (finalization code), Π½ΠΎ Π΄ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ cookie задаётся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²Π° la_objopen ().

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ la_objclose (), игнорируСтся.

la_preinit()

void la_preinit(uintptr_t * cookie );

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ всСх ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° main ()). Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ main () ΠΏΠΎΠ·Π΄Π½Π΅Π΅ всё Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ динамичСски Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dlopen (3).

la_symbind*()

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_objopen (), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ LA_FLG_BINDFROM . Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ defcook указываСтся ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт символ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ производится ссылка; это Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ указываСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ la_objopen (), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ LA_FLG_BINDTO .

Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ symname задаётся строка, содСрТащая имя символа.

АргумСнт flags прСдставляСт собой Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску, которая содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ символС ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния дальнСйшСго отслСТивания этой записи PLT (Procedure Linkage Table). ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ значСния Π² этом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅:

LA_SYMB_DLSYM

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° Π²Ρ‹Π·ΠΎΠ²Π° dlsym (3).

LA_SYMB_ALTVALUE

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² la_symbind* () Π²Π΅Ρ€Π½ΡƒΠ» Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для этого символа.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π² ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ la_pltenter () ΠΈ la_pltexit () (смотритС Π½ΠΈΠΆΠ΅), Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС la_symbind () для записСй PLT ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ссылкС Π½Π° символ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OR Π² *flags для измСнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ повСдСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

LA_SYMB_NOPLTENTER

НС Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ la_pltenter () для этого символа.

LA_SYMB_NOPLTEXIT

НС Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ la_pltexit () для этого символа.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ la_symbind32 () ΠΈ la_symbind64 () прСдставляСт собой адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Если ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° просто Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ Π·Π° привязкой символов, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ sym->st_value . ΠœΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто.

la_pltenter()

Π’ΠΎΡ‡Π½ΠΎΠ΅ имя ΠΈ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависят ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (подходящСС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² <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 * framesizep );

Π­Ρ‚Π° функция вызываСтся Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° записи PLT ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ для увСдомлСния ΠΎ привязкС.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² sym , ndx , refcook , defcook ΠΈ symname Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΊΠ°ΠΊ Ρƒ la_symbind* ().

АргумСнт regs ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² <link.h> ), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ значСния рСгистров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Π²Ρ‹Π·ΠΎΠ²Π° этой записи PLT.

АргумСнт flags ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску, которая сообщаСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ слСТСния Π·Π° этой записью PLT; значСния ΠΊΠ°ΠΊ Ρƒ la_symbind* ().

The framesizep argument points to a longΒ int buffer that can be used to explicitly set the frame size used for the call to this PLT entry. If different la_pltenter () invocations for this symbol return different values, then the maximum returned value is used. The la_pltexit () function is called only if this buffer is explicitly set to a suitable value.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ la_pltenter () Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ la_symbind* ().

la_pltexit()

Π’ΠΎΡ‡Π½ΠΎΠ΅ имя ΠΈ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависят ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (подходящСС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² <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 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² <link.h> ), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ значСния рСгистров, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Π²Ρ‹Π·ΠΎΠ²Π° этой записи PLT. АргумСнт outregs ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² <link.h> ), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ значСния для Π²Ρ‹Π·ΠΎΠ²Π° Π² эту запись PLT. Π­Ρ‚ΠΈ значСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΈ измСнСния Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ запись PLT.

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ GNU Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ la_pltexit () игнорируСтся.

Π’Π•Π Π‘Π˜Π˜

This API is very similar to the Solaris API described in the Solaris Linker and Libraries Guide , in the chapter Runtime Linker Auditing Interface .

БВАНДАРВЫ

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π―

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ отличия API динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° Π² Solaris:

β€’

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Solaris la_objfilter () Π½Π΅ поддСрТиваСтся Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ GNU.

β€’

Π’ функциях Solaris la_symbind32 () ΠΈ la_pltexit () Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° symname .

β€’

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Solaris la_pltexit () Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² inregs ΠΈ outregs (Π½ΠΎ Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ retval со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ).

ΠžΠ¨Π˜Π‘ΠšΠ˜

Π’ glibc Π΄ΠΎ вСрсии 2.9 Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² LD_AUDIT ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ падСнию Π²ΠΎ врСмя выполнСния. Π­Ρ‚ΠΎ исправлСно Π² glibc 2.10.

ΠŸΠ Π˜ΠœΠ•Π Π«

#include <link.h>
#include <stdio.h>
unsigned int
la_version(unsigned int version)
{
printf("la_version(): version = %u; LAV_CURRENT = %u\n",
version, LAV_CURRENT);
return LAV_CURRENT;
}
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 = %u; flags = %#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 = %u; flags = %#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 *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)

ΠŸΠ•Π Π•Π’ΠžΠ”

Русский ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ этой страницы руководства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»(ΠΈ) aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Π‘Π°Ρ€ΠΈΠ½ΠΎΠ² Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€, Иван Павлов <pavia00@gmail.com> ΠΈ Kirill Rekhov <krekhov.dev@gmail.com>

Π­Ρ‚ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ являСтся свободной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ; ΠΎΠ½ распространяСтся Π½Π° условиях общСдоступной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html вСрсии 3 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ) Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ авторского ΠΏΡ€Π°Π²Π°, Π½ΠΎ Π‘Π•Π— КАКИΠ₯-Π›Π˜Π‘Πž Π“ΠΠ ΠΠΠ’Π˜Π™.

Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ошибки Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ этой страницы руководства, поТалуйста, сообщитС ΠΎΠ± этом Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ(Π°ΠΌ) ΠΏΠΎ Π΅Π³ΠΎ(ΠΈΡ…) адрСсу(Π°ΠΌ) элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΠΏΠΎ адрСсу списка рассылки русских ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠ² .