2010-05-24 3 views
7

--strip-debug 또는 --strip-unneeded을 수행 할 경우 nm과 함께 모든 함수 이름을 나열하는 .ko이 있는데, 그냥 수행 할 경우 strip foo.ko로드를 거부하는 커널 모듈이 있습니다.리눅스 커널 모듈에서 로컬 심볼을 분리하지 않고 어떻게 제거합니까?

빠른 사람이 API를 리버스 엔지니어링 할 수 없도록 모듈 로딩에 필요하지 않은 모든 기호를 제거하는 방법을 알고 있습니까?

추 신 : 모든 사용자에게 오픈 소스 보폭 선교사; 이것은 일반 대중이 어떠한 경우에도 절대 사용하지 않을 것이므로 질문을 GPL 화염 전쟁으로 돌릴 필요가 없습니다.

+6

화염 전쟁을 피하고 싶다면 사람들을 불량배로 일반화하지 말 것을 제안합니다. –

+0

좋은 지적, 팀 :) 더 나은가요? : D – Kimvais

+2

"일반 대중"이 코드를 전혀 보지 못할 경우 왜 리버스 엔지니어링에 대해 걱정합니까? –

답변

7

, 또한 여기에 몇 가지 단서가 될 수있는 몇 가지 추측과 답변에 대한 단계입니다 :하는 .ko는 결과 .o 인 파일하지만 아무것도 내가 무엇을 기억에서

가 없습니다 소스 모듈에서 생성 된 모든 .o 파일을 병합하고 .modinfo 섹션을 추가합니다. .ko 빌드 Makefile의 끝에는 LD 호출이 있습니다. 내가 기억하는 것부터 ld가 -r 옵션과 함께 호출되며, Makefile이 .ko 파일을 생성하는 것입니다. 이 결과 파일을 아카이브 또는 개체 라이브러리 (.a 파일)와 혼동해서는 안됩니다. 여러 파일을 하나의 파일로 보관/패키징하는 형식 일뿐입니다. 병합 된 개체는 .o 파일을 생성하는 링크의 결과입니다. module : 그러나 결과 모듈에서 병합 될 수있는 모든 섹션이 있었고 해결할 수있는 모든 public/external 쌍이 해당 섹션에 포함되어있었습니다.

  • 그들이 이 .ko에서 .o를 통해 모듈을 호출하는 데 사용되기 때문에 통근되는 경우 : 그래서 난 당신이 모든 "로컬"통근 정의가 포함 된 .ko 파일을 결국 가정 (그러나 외부 .ko에서 호출 할 예정 이 아니기 때문에 더 이상 필요하지 된다), 그리고

  • 은 .ko 모듈이 해야합니까 그들 제대로 로더 와 커널과 통신합니다.

전자는 대부분 이미 병합시 LD에 의해 해결하지만, LD 당신이 .ko 외부에서 그들도 호출이 의도 여부를 알 수있는 방법이되지 않았다.

당신이 볼 수있는 관계없는 기호는 각각의 .o 파일에 대한 extern이지만 결과 .ko의 extern으로 필요하지 않은 기호입니다. 그리고 당신이 찾고있는 것은 그것들을 제거하는 방법입니다.

이 마지막 단락에서 제거 할 기호를 올바르게 설명합니까?

+0

이것이 바로 우리가 여기서 말하는 것입니다. 이전에 업데이트하지 않으셔서 죄송합니다. 어쨌든 당신이 여기서 말하는 말은 완벽합니다. 나는 더 깊이 조사해야 할 것입니다. – Kimvais

3

가 나는 문제가 정말 이해 확실하지 않다 : 나는 명시 적으로 내 메이크에

ccflags-y += -ggdb -O0 -Wall 

같은 것을 추가하지 않는 경우 가하는 .ko을 개발할 때, 나는 어떤을하지 않습니다 그러나 내가 출판하거나 외부 추천을받는 사람에게만 해당됩니다.

  • 파일을 덤핑하고 ELF 분석은 테이블,
  • 이되지 않습니다 보여줍니다

    • 결과 .ko 파일이 상당히 작 : 나는 몇 가지 이유에 대한 어떤 다른 기호를 얻을하지 않습니다 확신
    • kgdb에서 기호를 보거나 액세스 할 수 없습니다.

    그래서 나는 당신의 질문에 약간 당황 스럽습니다. 실제로 ... .ko에서 보았던 기호는 무엇입니까 (그리고 원하지 않습니까)? 소스 파일에서 어떻게 선언되어 있습니까? ELF 섹션에서 어떤 결과가 나타 납니까? (미안하지만 어리석은 질문입니다.) 자신의 모듈 외부에서 볼 필요가없는 모든 것을 정적이라고 정의 했습니까? 내 이전 질문에 대한 응답 없음으로

    +0

    아니, 거기서'-Os'와'-g' -flags로 끝납니다. – Kimvais

    6

    I think this is exactly what we are talking about here.

    좋아, 그럼 하나의 해결책은 불필요한 기호를 "수동으로"제거하는 것입니다. "strip"유틸리티는 심볼을 개별적으로 스트립 (또는 보관) 할 수 있으므로, --strip-all--keep-symbol =의 작은 묶음을 사용해야합니다. - 카드도 약간 도움이 될 수 있습니다. 물론 가장 반대되는 부분에 따라 반대되는 작업을 수행 할 수 있습니다.

    좋은 시작은 모듈에서 모듈 간 링크를 위해 명시 적으로 정의 된 모든 심볼을 제거하는 것일 수 있으며, 명백한 유용한 것들, 즉 init 및 exit 만 남기고 싶지는 않습니다. 또한 커널 개발 소프트웨어 인프라 스트럭처에 의해 생성되거나 커널 개발 소프트웨어 인프라 스트럭처에 속한 소프트웨어는 다루지 않습니다. 그런 다음 올바른 방법을 찾을 때까지 시행 착오 ... 사실, EXPORT_SYMBOL (물론 init/exit)이라고 명시 적으로 정의한 기호를 제외하고는 모든 기호가 제거 될 수 있다고 생각합니다.

    행운을 빈다. :)

    PS :

    사실, 필요한 소스 정보가 수행하는 모든 .ko 프로젝트에 존재하는 것으로 보인다 필요한 자동 제거 : 내가 뭔가를 누락하지 않는 한, 그것은 보인다 EXPORT_SYMBOL 아니에요 아무것도 또는 빌드 소프트웨어에 의해 명시 적으로 삽입 된 파일은 이론적으로 .ko 빌드가 끝나는 "ld -r"시간이 끝날 때 기본적으로 제거 될 수 있습니다. 그것은 단지 도구 체인 (컴파일러/링커)이 개별적으로 relocatable 링크/병합에 대한 "제거 또는 유지"지정을 지정하는 규정/지시문/옵션을 가지고 있다고 생각하지 않습니다. 그렇지 않으면 EXPORT_SYMBOL 매크로 및 일부 다른 곳에서 약간의 수정을하면 결과를 얻을 수 있고 모든 Linux 시스템에서 대부분의 .ko 파일에서 일부 바이트를 줄일 수 있습니다. filofel의 게시물에 추가

    +0

    이 종류는 질문을 -'_init()','* _exit()'와 내가 명시 적으로''EXPORT_SYMBOL (')하는 것 이외에는 무엇이 필요합니까? - 아니면 정말로 전부입니까? – Kimvais

    +0

    이것이 제가 시행 착오 일 것이라고 언급 한 이유입니다. 나는 그다지 그 경기를 할 필요가 없었습니다. 나는 내 자신을 넣지 않은 기호에 홀로 남겨두고, 내 자신의 소스 모듈을 통해 호출하는 모든 것을 제거하는 것으로 시작합니다. 아마도 .ko ld에 의해 해결되었을 것입니다. 그게 작동한다면, 나는 이것을 하나부터 시작해서 좀 더 정리하고, 단편적으로 테스트하고, 반복하는 것을 시도 할 것입니다. 경험이 많지만 문제가 해결된다면 충분할 것입니다. – filofel

    1

    : 사용자 공간 공유 라이브러리를 제거하는 것은 그들의 수출 기호는 제거되지 않습니다되어 .dynsym 섹션에 있기 때문입니다 기능을 유지

    이유. .ko 그러나 파일은 dynsym을 사용하지 않습니다.

    1

    명 난 그냥 디버그 기호가 사용했던 커널 설정을 실현하지 않고 커널을 내장

    strip --strip-unneeded 
    
    +0

    이 플래그로 실제로 무엇이 제거됩니까? – aisbaa

    5

    과 성공을보고, 그래서 그 결과 모듈의 크기가 상당히 크다고. 이것은 나를 위해 일한 :

    # du -sh /lib/modules/3.1.0/ 
    1.9G /lib/modules/3.1.0/ 
    # find /lib/modules/3.1.0/ -iname "*.ko" -exec strip --strip-debug {} \; 
    # du -sh /lib/modules/3.1.0/ 
    134M /lib/modules/3.1.0/ 
    

    *.ko 이름 /lib/modules/3.1.0에있는 모든 파일을 찾아 그들 각각에 strip --strip-debug을 실행합니다.Linux Kernel 3.0.8와 임베디드 장치에서이 명령에 의해 sloved 무슨 무슨 일이 있었 같은

    0

    strip -g XXX.

    내 이전 문제.

    +0

    나는 몇 가지 시행 착오를 통해 커널 모듈에서'strip -g'를 사용하여 정상적으로 생성 된 것으로부터'* .ko '를 변경하지 않는다는 것을 알게되었습니다. 그러나 동료와의 협업을 통해 gcc 옵션'-g0' *을 사용하면 * 디버깅 기호에 영향을 미치지 않는 것으로 보입니다. 커널 모듈이 다른 모듈과 약간 다르게 구성 되었기 때문에 이것이 의심 스럽습니다. [이 답변보기] (https://stackoverflow.com/a/4238266/988207). –