Для тестирования LD_PRELOAD я написал свой собственный getpid
, который печатает что-то перед вызовом исходного getpid
с помощью dlsym. Код приведен ниже.
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>
typedef pid_t (*getpidType)(void);
pid_t getpid(void)
{
printf("Hello, getpid!\n");
getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid");
return f();
}
Однако, когда я использую такой getpid
в своей программе и запускаю ее с помощью LD_PRELOAD, набрав LD_PRELOAD=./prelib.so ./prog
, я получаю следующую ошибку.
./prog: symbol lookup error: ./prelib.so: undefined symbol: dlsym
Но если я делаю LD_PRELOAD=./prelib.so bash -c 'echo $$'
, такой ошибки нет. Любая идея, что здесь происходит.
-ldl
? - person Nikolai Fetissov   schedule 22.05.2012export
это сделали? т.е.export LD_PRELOAD
потом. Это переменная среды, поэтому в какой-то момент ее нужно экспортировать именно так. - person FatalError   schedule 22.05.2012LD_PRELOAD=./prelib.so ./prog
эквивалентен экспортуLD_PRELOAD
перед вызовом./prog
- person Michał Kosmulski   schedule 22.05.2012ldd /bin/bash
- person Hasturkun   schedule 22.05.2012libdl
, она уже загружена в глобальное пространство символов, и.so
не нужно явно зависеть от нее. Но чтобы работать во всех случаях,.so
не требует явного включения. - person R.. GitHub STOP HELPING ICE   schedule 22.05.2012