♧ 공유 라이브러리 의존관계란,

실행 파일 또는 공유 라이브러리에서 필요로 하는 공유 라이브러리의 SONAME이

ELF 정보 내의 동적 섹션에 있는 NEEDED에 기록된 정보로 관리되고 있음을 의미한다.

▷ 개별 파일 내의 NEEDED는 objdump 또는 readelf를 사용해서 확인할 수 있지만,

의존관계를 이루고 있는 모든 공유 라이브러리를 출력하려면 ldd명령을 이용한다.

▷ ldd 명령은 내부적으로 환경변수 LD_TRACE_LOADED_OBJECTS를 이용해 구현되어 있다.

   

   

[ objdump 와 readelf로 공유 라이브러리 의존 관계 확인 ]

♧ 공유 라이브러리를 이용할 때, 실행 파일 또는 공유 라이브러리 자체는

이를 실행 하려 할 때 필요한 공유 라이브러리에 대한 정보를 갖고 있다.

▷ 그 정보는 ELF 동적 섹션의 NEEDED에 기록.

   

▶ [/bin/ls]를 objdump/readelf 명령을 사용하여 확인

objdump -p ::

   

readelf -d ::

▷ 이와 같이 /bin/ls는 [librt.so.1, libselinux.so.1, libacl.so.1, libc.so.6]

4개의 공유 라이브러리를 필요로 함.

▷ 그러나 /bin/ls 실행할 때 이 4개의 공유 라이브러리만 필요한 것은 아니다.

(4개의 공유 라이브러리는 각각의 또 다른 공유 라이브러리를 필요로 하기 때문.)

   

NEEDED로 표시되 어 있는 것은 SONAME이므로, SONAME으로부터 실제 파일을 찾아야 한다.

▷ 특히 설정되어 있지 않은 경우에는

/usr/lib(또는 /lib)에 SONAME에 해당하는 파일이 공유 라이브러리다.

(실제로는 /lib/tls 또는 /lib/tls/i686/cmov 등에 있는 공유 라이브러리가 사용 되기도 함)

▷ 환경변수 LD_LIBRARY_PATH에 라이브러리 경로를 설정한 경우 해당 디렉토리를 참조.

/etc/ld.so.cache에 기록 정보를 참조.

(/etc/ld.so.conf의 설정을 이용해 ldconfig를 실행할 때 갱신)

▷ 예를 들어 [ librt.so.1 ]의 경우, /lib/librt.so.1이라는 파일(심볼릭 링크)이 존재하므로,

이것이 SONAME librt.so.1에 해당하는 공유 라이브러리 파일이다.

   

▶ [ librt.so.1 ]이 필요로 하는 라이브러리 확인.

...(중략)...

   

▶ [ /bin/ls ]의 다른 공유 라이브러리도 의존 관계를 확인.

(※ 공유 라이브러리 의존관계는 CPU종류, OS 배포판에 따라 조금씩 다르다.)

   

   

[ ldd로 공유 라이브러리 의존 관계 확인 ]

♧ 앞에서 살펴본 바와 같이 objdump / readelf를 사용해 공유 라이브러리 의존 관계를 확인할 수는

있지만, 각각의 공유 라이브러리에 대한 의존관계를 개별적으로 확인해야 하므로 다소 번거롭다.

또한 실제 실행될 때 사용되는 공유 라이브러리의 디렉토리 경로를 정확히 얻기도 어렵다.

 

▶ ldd로 공유 라이브러리 의존 관계 확인.

(※ ldd는 실행 파일 외에도 공유 라이브러리에도 사용 가능)

- 이와 같이 실행파일이 필요로 하는 공유 라이브러리의 SONAME, 경로명과 할당된 메모리 주소를 확인.

 

▷ 사실 GNU/리눅스에서 ldd 명령은 단순히

환경변수(LD_TRACE_LOADED_OBJECTS)를 이용한 셸 스크립트이다.

▷ LD_TRACE_LOADED_OBJECTS에 1을 설정해서 프로그램을 실행하면 프로그램 실행 시점에

ELF 인터프리터(런타임 로더 /lib/ld_linux.so.2)가 필요한 공유 라이브러리를 찾아

메모리에 로딩해서 그 정보를 표시한 후, 실제 프로그램이 실행되기 전에 종료하게 된다.

 

▶ LD_TRACE_LOADED_OBJECTS를 이용한 공유 라이브러리 의존성 확인.

- 이와 같이 ldd와 동일한 결과를 얻을 수 있다.

   

▷ LD_TRACE_LOADED_OBJECTS는 실행 파일이 아닌 공유 라이브러리에의 경우 실행할 수 없다.

   

▷ 이런 경우에는 런타임 로드 /lib/ld-linux.so.2를 실행한다.

  



출저 : 컴퓨터 서적 정리/Binary Hacks / http://devanix.tistory.com/185


'리눅스 명령어' 카테고리의 다른 글

특정 파일내 문자열 치환 2  (0) 2016.10.13
파일 내 특정 문자열 검색과 치환  (0) 2016.10.13

문자열 치환을 할때 슬러쉬나 특수문자가 들어갈때

 

 -> sed -i 's/${fileWithPath}/HAHA/g' $file

 

 이렇게

 -> sed -i 's|'$fileWithPath'|HAHA|g' file

 

 쓰는 방법이 있다.

찾기만 할 때 문법은 다음과 같다.

find 검색할 디렉토리 -name "*" | xargs grep 검색할 내용.
ex) find /home/xxxx/yyyy -name "*" | xargs grep ttf


** 2016.03.15
근데 위에 방법에 문제가 있는지.. 잘 안되는 것 같다. 그냥 grep 만 사용해도 된다.

grep -r "xxxx" 디렉토리경로
ex) grep -r "너구리" .


-r 은 하위 디렉토리까지 모두(Recursively) 검사하라는 뜻이다.

원문은 이 곳에.

바꾸기까지 하려면 응용이 필요하다.
예를 들어, 한 디렉토리 내에 모든 파일을 검색하고, 파일 내용에 있는 특정 문자열을 다른 문자열로 바꿔주고 싶다면 다음과 같이 한다.

먼저 바꾸고자하는 파일들이 있는 특정 디렉토리로 이동한다.
 find . -type f -exec sed -i 's/찾는 문자열/바꿀 문자열/g' {} \;


예) find . -type f -exec sed -i 's/lucid/maverick/g' {} \;


만약 모든 파일이 아니고 특정 파일만 찾는 것이라면, 첫번째처럼 조건을 주면 된다.
예) find /etc/apt/sources.list.d -iname '*.list' -exec sed -i 's/lucid/maverick/g' {} \;

이렇게 되면, 각 파일에 포함되어 있던 lucid 문자열이 maverick 으로 모두 바뀐다.

이 부분은 이 곳 을 참고했다.

[출처] http://egloos.zum.com/nemonein/v/4686258 by 아무도안

'리눅스 명령어' 카테고리의 다른 글

ldd - 공유 라이브러리 의존관계 확인  (0) 2016.12.29
특정 파일내 문자열 치환 2  (0) 2016.10.13

+ Recent posts