실행 파일 경로를 기준으로 공유 객체 로드

실행 파일 경로를 기준으로 공유 객체 로드

나는 어디에서 호출하든 관계없이 상대 디렉터리에서 공유 개체를 로드하기 위해 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'

관련 정보