7
我想創建可在兩種不同的方式加載到目標共享庫:動態加載Linux共享庫?
- LD_PRELOAD通過
dlsym
我的共享庫
#include "stdio.h"
void __attribute__ ((constructor)) my_load(void);
void my_load(void) {
printf("asdf");
}
void someFunc(void) {
printf("someFunc called");
}
我正在像這樣編譯它:
all:
gcc -fPIC -g -c -Wall MyLib.c
gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc
我不希望與ldconfig
安裝等目標的過程是這樣的:
#include <stdio.h>
#include <dlfcn.h>
void func1() {
printf("%d\n", 1);
}
void func2() {
printf("%d\n", 2);
}
void func3() {
printf("%d\n", 3);
}
int main() {
void* lib_handle = dlopen("/home/mike/Desktop/TargetProcess/MyLib.so.1.0.1",
RTLD_NOW|RTLD_GLOBAL);
if(lib_handle == NULL) {
printf("Failed loading lib\n");
} else {
printf("Loaded lib successfully\n");
void (*some_func)() = dlsym(lib_handle, "someFunc");
printf("%p\n", some_func);
dlclose(lib_handle);
}
func1();
func2();
func3();
return 0;
}
目標被編譯爲這樣:
all:
gcc TestProg.c -ldl -o TestProg
我的問題是:
- 如上所述動態加載
dlopen
爲什麼my_load
似乎不被稱爲? - 使用相同的方法,即使
dlopen
返回非空,爲什麼dlsym
始終返回nil
?同樣,nm
不會列出my_load
或someFunc
作爲.so的符號。 - 是否可以使用
LD_PRELOAD
加載庫?我試圖將.so複製到與目標相同的目錄中,然後調用LD_PRELOAD="./MyLib.so.1.0.1" ./TestProg
,但似乎還沒有調用my_load
。
完美地工作。它按照LR_PRELOAD以及動態的方式加載。在這兩種情況下也調用my_load。謝謝! –
其實它不是空的,它包含一些libc的東西。如果你沒有指定'-lc',鏈接將失敗。 :) – ninjalj