실행 가능 경로를 기준으로 공유 객체 로드

실행 가능 경로를 기준으로 공유 객체 로드

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

관련 정보