로컬 libc를 지정하면 전역 libc가 호출됩니까?

로컬 libc를 지정하면 전역 libc가 호출됩니까?

foo 명령을 실행하고 다음과 같이 사용할 다른 libc를 지정하면:

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo

위에 주어진 명령을 실행하는 데 전역적으로 정의된 libc가 사용됩니까?


상황에 맞게 libc가 물리적으로 존재하고 컴퓨터에 액세스할 수 있지만 어떤 이유로 사용할 수 없는 상황을 생각해 보세요. 로그인된 쉘에서 특정 명령을 실행하려면 다른 libc를 제공해야 합니다.

inline을 지정하면 LD_LIBRARY_PATH전역적으로 정의된 libc를 호출하지 않고 작업 libc의 위치로 설정됩니다.

새로운 환경 변수를 로컬에서 정의하기 위해 전역적으로 정의된 libc를 동일하게 호출합니까?

답변1

아니요. 동적 연결은 /lib/libc.so.6기능이라는 점에서 libc의 일부가 아닙니다 /lib/ld.so(둘 다 수년에 걸쳐 파일 이름과 경로가 일부 변경되었지만 본질은 동일합니다).

ld.so, 동적 링커도 공유 라이브러리입니다. 이를 로드하는 것은 대부분의 Linux 바이너리가 main()함수를 호출하기 전에 수행하는 첫 번째 작업입니다 .

ld.solibc와는 다른 파일이지만 소스 코드와 컴파일된 바이너리 형식도 gnu libc 배포판의 일부입니다 .

링크는 ld.so모든 Linux ELF 바이너리에 대해 gcc에서 제공하는 하드 코딩된 코드 블록에서 나옵니다. 해당 경로도 바이너리에 하드코딩되어 있습니다. 필요한 경우 변경이 가능하더라도 쉽게 변경할 수는 없습니다.

libc.so.6대체 설정으로 재정의 하면 LD_LIBRARY_PATH이 라이브러리는 주문한 libc를 사용자 고유의 libc로 대체하지만 여전히 일반 ld.so.

따라서 귀하의 질문에 대한 대답은 "예, 하지만..."입니다.

답변2

질문에 주어진 명령을 실행하면 :

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC bash -c 'foo'
  • 실행에서는 bash경로에 제공된 libc를 사용합니다( $PATH_TO_MY_CUSTOM_LIBC경로에 있는 경우). 해당 환경 변수를 존중하는 것은 링커/로더입니다.
  • Bash 내에서 실행되는 명령(당신이 부르는 대로 foo)은 링커/로더 자체를 통해 시스템에서 정기적으로 발견되는 libc를 사용합니다 /etc/ld.so.cache.

관련 정보