2013-08-28 3 views
6

때 고양이 'PROC/kallsyms'또는 'system.map'우리는 T, R, D의 의미는 무엇인지이__ksymtab은 무엇입니까? 리눅스 커널에서

.... 
c033718c T nf_hook_slow 
c04ca284 r __ksymtab_nf_hook_slow 
c04ca28c r __ksymtab_nf_hooks 
c04d24a0 r __kcrctab_nf_hook_slow 
c04d24a4 r __kcrctab_nf_hooks 
c04e9122 r __kstrtab_nf_hook_slow 
c04e9179 r __kstrtab_nf_hooks 
c054d854 D nf_hooks 
c0571ca0 d nf_hook_mutex 
.... 
  1. 같은 기호 D 거즈를 얻을?
  2. 커널 소스에서 심볼을 EXPORT_SYMBOL (...) 으로 찾을 수 있지만 __ksymtab ... 또는 __kstrtab이라는 접두어가 붙은 다른 것들이 있습니다 ... 무엇입니까?
  3. System.map에는 심볼이 있지만/proc/kallsyms에는 제외 될 수 있습니까? 내가 넷 리눅스 커널을 사용하도록 설정 한하지만 난 기호 'nf_hooks' 하지만이 '__ksymtab_nf_hook'를 찾을 수 없습니다
  4. (가정 커널이 제대로 컴파일). __ksymtab_nf_hook을 사용하여 nf_hooks 주소를 얻는 방법이 있습니까? ?
  5. 내 리눅스 소스 코드 EXPORT_SYMBOL (nf_hook)에서 볼 수 있지만 'cat/proc/kallsyms'인 경우 찾을 수 없습니다. 거기에 몇 가지 전형적인 이유가 있습니까?

미리 감사드립니다.

답변

7
  1. 형식은 output of nm utility 유사하다도 this page 참조. 'T'는 일반적으로 전역 (비 정적이지만 반드시 내보낼 필요는 없음) 함수를 나타내며, 't'- 컴파일 유닛에 로컬로있는 함수 (즉, 정적), 'D'- 글로벌 데이터, 'd'- 컴파일 단위의 로컬 데이터. 'R'및 'r'- 읽기 전용 데이터의 경우 'D'/ 'd'와 동일합니다.

  2. 심볼을 커널 모듈에서 사용할 수 있도록 심볼을 내보내는 데 필요한 특수 섹션의 항목입니다. 다음은 EXPORT_SYMBOL()에 의해 정의되는 등 적어도 내 보낸 각 기호에 대한

    :

    • __kstrtab_<symbol_name> - 문자열
    • __ksymtab_<symbol_name>과 기호의 이름 - 기호에 대한 정보와 구조 : 해당 주소, 등 __kstrtab_<symbol_name>의 주소
    • __kcrctab_<symbol_name> - 제어 합 (CRC)의 주소는 심볼 - 커널 또는 모듈이 소정의 커널에 의해 필요에 따라 정확하게 동일한 기호 제공 여부를 확인하기 위해, 예를 들어, 사용 기준 치수. 모듈이 주어진 이름과 CRC를 가진 심볼을 필요로하고 커널이 그 이름을 가진 심볼을 제공하지만 다른 CRC (모듈이 다른 커널 버전 용으로 컴파일 된 경우)를 제공하면 모듈 로더는 해당 커널 모듈을로드하지 않습니다. 이 체크가 비활성화되어 있지 않은 한).

    자세한 내용은 EXPORT_SYMBOL() 매크로의 구현을보십시오 (linux/export.h).

  3. 잘 모르겠지만 System.map에 함수 ("텍스트 기호") 또는 변수 ("데이터 기호")가 있지만/proc/kallsyms에 표시되지 않은 상황이 발생하지 않았습니다. 커널이 적절히 컴파일되고 kallsyms가 완전히 활성화되어 있습니다 (CONFIG_KALLSYMS = y, CONFIG_KALLSYMS_ALL = y). CONFIG_KALLSYMS_ALL = n이면, (정확하게는 * .text 섹션의 심볼 인) 기능 만/proc/kallsyms에 표시됩니다.

  4. 커널 버전에 따라 다릅니다. 커널에 대해 EXPORT_SYMBOL()의 정의를 살펴보고 __ksymtab_<symbol_name> 변수가 무엇인지 찾아 볼 수 있습니다. 커널 3.11에서는 이 linux/export.h에 정의되어 있습니다. 그 구조체의 정의와 그 주소를 가지고, 나는 당신이 심볼의 주소를 얻을 수 있다고 가정한다 : struct kernel_symbol::value. 나 자신을 시도하지 않았다.

    그러나 __ksymtab_nf_hooknf_hook이고, nf_hooks은 아닙니다. 이름이 일치해야합니다. nf_hooksnf_hook은 다른 엔티티입니다.

  5. /proc/kallsyms의 코드와 관련 부분을 보지 않고 말하기가 어렵습니다. 어쩌면 # ifdef'ed 및 전혀 컴파일되지 않은, 뭔가있을 수 있습니다.

    게다가, nf_hooks은 데이터 항목이므로 CONFIG_KALLSYMS_ALL이 'n'이면/proc/kallsyms에 표시되지 않을 수 있습니다.

+0

감사합니다. 훌륭하다. – daehee