Tôi muốn tạo ra một thư viện chia sẻ mà có thể được nạp theo hai cách khác nhau vào các mục tiêu:Tự động tải các thư viện được chia sẻ Linux?
- LD_PRELOAD
- động tải qua
dlsym
thư viện chia sẻ của tôi trông như thế này:
#include "stdio.h"
void __attribute__ ((constructor)) my_load(void);
void my_load(void) {
printf("asdf");
}
void someFunc(void) {
printf("someFunc called");
}
Tôi đang biên dịch nó như sau:
all:
gcc -fPIC -g -c -Wall MyLib.c
gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc
Tôi không muốn cài đặt nó với ldconfig
vv Quá trình mục tiêu trông như thế này:
#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;
}
Mục tiêu được biên dịch như vậy:
all:
gcc TestProg.c -ldl -o TestProg
Câu hỏi của tôi là:
- Với tải động với
dlopen
như trên, tại saomy_load
không xuất hiện để được gọi? - Với cùng một phương pháp, tại sao
dlsym
luôn trả lạinil
mặc dùdlopen
trả về không null? Tương tự,nm
không liệt kê hoặc làmy_load
hoặcsomeFunc
làm biểu tượng của .so. - Có thể sử dụng
LD_PRELOAD
để tải thư viện không? Tôi đã thử sao chép .so vào cùng một thư mục với mục tiêu sau đó gọiLD_PRELOAD="./MyLib.so.1.0.1" ./TestProg
nhưng lại một lần nữamy_load
dường như không được gọi.
Hoạt động hoàn hảo. Nó được nạp như mong đợi bởi cả LR_PRELOAD cũng như động. 'my_load' cũng được gọi trong cả hai trường hợp. Cảm ơn! –
Trên thực tế nó không có sản phẩm nào, nó chứa một số công cụ libc. Liên kết sẽ thất bại nếu bạn không chỉ định '-lc'. :) – ninjalj