나는 어디에서 호출하든 관계없이 상대 디렉터리에서 공유 개체를 로드하기 위해 C 응용 프로그램을 얻으려고 합니다. 지금까지는 호출할 때 실행 파일과 동일한 디렉터리에 있는 경우에만 작동합니다.
~/prog$ ./my_program
Success
~/prog$ cd ..
~$ ./prog/my_program
./prog/my_program: error while loading shared libraries: libs/libmysharedobject.so: cannot open shared object file: No such file or directory
위 출력에서 짐작할 수 있듯이 공유 객체는 이 ~/prog/libs/
디렉터리에 저장됩니다. 관련 gcc 호출은 다음과 같습니다.
gcc -std=c99 -ggdb -Wall -pedantic -Isrc
-fPIC -shared -Wl,-soname,libs/libmysharedogbject.so
-o libs/libmysharedobject.so libs/mysharedobject.c
[...]
gcc [CFLAGS omitted] -o my_program main.c
build/src/my_program.o build/src/common.o
-lm -Llibs -lmysharedobject
이것은 출력의 상단입니다 readelf -d my_program
.
Dynamic section at offset 0x6660 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libs/libmysharedobject.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
추가를 시도했는데 결과에 -Wl,-z,origin,-rpath='$ORIGIN'
다음 줄이 표시되었습니다 .readelf
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
[...]
0x000000006ffffffb (FLAGS_1) Flags: ORIGIN
그러나 이것은 내 문제를 해결하지 못하는 것 같습니다. 또한 , 및 rpath
으로 설정을 시도했지만 아무 소용이 없습니다. (업데이트: 아무것도 작동하지 않습니다. 절대 경로로 확장되기 때문에 놀랐습니다.)$ORIGIN/libs
.
./libs
$(CURDIR)
LD_LIBRARY_PATH
실행 파일이 호출된 디렉토리에 관계없이, 바람직하게는 최종 사용자가 매번 설정할 필요 없이 공유 객체를 찾을 수 있는 방법이 있습니까 ? 아니면 Linux가 지원하지 않는 작업을 수행하려는 걸까요?
답변1
rpath를 $ORIGIN/libs로 설정하고 soname을 libs/libsharedobject 대신 libsharedobject로 설정합니다. 내 메이크 파일은 다음과 같습니다.
all: my_program
libs/libmysharedobject.so: Makefile success.c
gcc -fPIC -shared -Wl,-soname,libmysharedobject.so \
-o libs/libmysharedobject.so success.c
my_program: Makefile libs/libmysharedobject.so
gcc -o my_program main.c -Llibs -lmysharedobject -Wl,-R,'$$ORIGIN/libs'