2009-08-10 6 views
3

소스를/usr/bin/ldd에서 확인하면 실행 파일의 종속성을 찾기 위해 ld-linux를 사용합니다. --verify를 사용하여 ld-linux를 먼저 호출합니다. 논의. 그런 다음 스크립트는 ld-linux --verify 호출의 종료 코드에 따라 다르게 작동합니다.ld-linux - 종료 코드 확인

ld-linux의 설명서 페이지는 종료 코드에 대한 정보를 제공하지 않으며 Google 검색은 가치가 없습니다. ld-linux --verfify와 각각의 의미에 대한 종료 코드 목록을 제공하는 곳에서는 (ld-linux의 소스 코드를 보는 것 이외의) 어느 곳에서나 문서가 있습니까?

답변

1

몇 가지 실험을했는데 성공하면 종료 상태가 0이고 실패하면 1이됩니다. 여기에는 쉘 스크립트를 확인하는 것과 같은 괴상한 남용이 포함됩니다.

성공하면 0, 실패시 0이 아닌 것으로 가정하면 안전 할 것입니다.

내가 어떤 문서를 찾을 수 있지만하지 않았다
+0

불행히도 그런 경우는 아닙니다. 0은 참으로 "성공"이지만 0이 아닌 값이 많으며 각각에 대해 많은 의미가 있습니다. 예를 들어, ldd는 반환 값이 0 또는 2이면 한 가지 방법을 사용하고 반환 값이 5 인 경우 다른 방법을 사용합니다. 그러나 2는 무엇을 의미하는지 모릅니다 (5는 "스크립트의 일부 주석에 따라 __libc_enable_secure를 사용하여 호출됩니다" 그래서 저는 2가 뭔가를 의미한다고 생각할 수 있습니다. 적어도 3과 4가 있습니다. – Fred

+0

@Fred : Bletch. 당신은 왜 당신이 알아야 할 필요성을 말하지 않았지만, 제가 당신을 위해 남긴 조언은 오직 하나입니다. 먼 옛날부터 멀고 먼 곳입니다. 루크를 사용하십시오! –

1

...

if (__builtin_expect (mode, normal) == verify) 
    { 
     /* We were called just to verify that this is a dynamic 
     executable using us as the program interpreter. Exit with an 
     error if we were not able to load the binary or no interpreter 
     is specified (i.e., this is no dynamically linked binary. */ 
     if (main_map->l_ld == NULL) 
     _exit (1); 

     /* We allow here some platform specific code. */ 
#ifdef DISTINGUISH_LIB_VERSIONS 
     DISTINGUISH_LIB_VERSIONS; 
#endif 
     _exit (has_interp ? 0 : 2); 
    } 

그래서 ...

  • 0은 프로그램이 동적으로 링크 된 "성공, 즉 뜻이 동적 링커는 처리 할 수 ​​있습니다 it "
  • 1 ld-linux가"바이너리를로드 할 수 없음 "을 의미합니다 (존재하지 않는 비 - 바이너리 또는 정적 바이너리 파일을 가지고 ld-linux를 실행할 때 을 얻었습니다)
  • 2는 "해석기가 지정되지 않았습니다"를 의미합니다. 특히, 프로그램 헤더 테이블에 p_type이 같은 요소가 없습니다 (공유 라이브러리를 사용하여 ld-linux를 실행할 때 이걸 얻습니다)

다른 코드는 없습니다.