UNIX에서 LD_PRELOAD 환경 변수 사용 예

4450 단어 bashclinuxshell

LD_프리로드


LD_PRELOAD 환경 변수를 사용하여 공유 라이브러리를 가져올 위치를 설정할 수 있습니다. 이 변수를 설정하면 기존 기능을 덮어쓰고 표준 명령이 원하는 방식으로 다르게 작동하도록 할 수 있습니다.

링커는 기본 파일을 컴파일하기 위해 LD_PRELOAD에서 제공하는 경로의 라이브러리를 연결합니다. 기능이 연결되면 동일한 기능의 다른 인스턴스가 나타날 때 이전 위치는 무시되고 새로운 위치가 사용됩니다.

예를 들어 puts 파일에 있는 stdio.h 함수를 덮어쓰도록 합시다.



다음 내용이 포함된 파일main.c을 고려하십시오.

  #include <stdio.h>

  int theFunction(const char *s)
  {
      return puts(s);
  }

  int main (int argc, char** argv) {
      theFunction("Hello, this is traditional work flow.");
      printf("%s: puts location: %p\n", __FILE__, puts);
  }

main.c 파일을 컴파일하고 실행하면 puts 위치가 0x7f877af52ef0 인 다음 출력이 제공됩니다.



다음과 같이 다른 파일unmain.c을 만듭니다.

  #include <stdio.h>

  int puts(const char *__s)
  {
      return printf("New puts, hackerman alert!\n");
  }


이제 다음 명령을 사용하여 이unmain.c 파일의 공유 라이브러리를 생성합니다.

  gcc -fPIC unmain.c -shared -o unmain.so


공유 라이브러리의 위치LD_PRELOADunmain.so를 업데이트합니다.

  export LD_PRELOAD="$PWD/unmain.so"


그런 다음 첫 번째 컴파일된main.c 파일의 실행 파일main.o을 다시 실행하여 puts의 위치가 업데이트되었는지 확인합니다. 제 경우에는 새 위치가 0x7f6003f5d119 로 설정되었습니다.

  ./main.o




공유 라이브러리를 제거하려면 unset를 사용하여LD_PRELOAD .

  unset LD_PRELOAD




Github에 기여하는 동일한 예: https://github.com/chhajedji/ld-preload

좋은 웹페이지 즐겨찾기