2013-08-01 2 views
0

일부 주변 장치에 대한 바이너리 Linux 커널 모듈이 있습니다. 잘 작동하지만 성능상의 이유로 커널을 제거한 프로파일 링을 사용합니다. 제 3 자 독점 소프트웨어이고 소스 코드에 액세스 권한이 없기 때문에 모듈 을 다시 컴파일 할 수 없습니다. 나는 에 필요한 오브젝트 파일 (* .o) 만 가지고 내 Linux 커널 버전에 드라이버를 연결합니다.사전 컴파일 된 Linux 커널 모듈에서 __gnu_mcount_nc에 대한 참조를 제거하십시오.

.ko 파일을 처리하고 __gnu_mcount_nc으로 점프를 제거 할 수 있습니까? 을 bl <__gnu_mcount_nc>에서 mov r8,r8으로 변경하려고했지만, 외부 기능에 대한 모든 분기에 ebfffffe opcode가 있다는 사실 때문에 을 달성하기가 어려웠습니다. 이것은 내가 피하고 싶은 재배치 주제로 안내합니다. 나는 간결한 해결책으로 을 찾고있다.

Disassembly of section .text: 

00000000 <some_func1>: 
     0:  e92d4000  push {lr} 
     4:  ebfffffe  bl  18e0 <__gnu_mcount_nc> 
     8:  e3a00001  mov  r0, #1 
     c:  e12fff1e  bx  lr 

00000010 <some_func2>: 
     10:  e92d4000  push {lr} 
     14:  ebfffffe  bl  18e0 <__gnu_mcount_nc> 
     18:  e3a00001  mov  r0, #1 
     1c:  e12fff1e  bx  lr 

00000020 <some_func3>: 
     20:  e92d4038  push {r3, r4, r5, lr} 
     24:  e92d4000  push {lr} 
     28:  ebfffffe  bl  18e0 <__gnu_mcount_nc> 
     2c:  e1a04001  mov  r4, r1 
     30:  e59f3038  ldr  r3, [pc, #56] ; 70 <some_func3+0x50> 
     34:  e5905034  ldr  r5, [r0, #52] ; 0x34 
... 

대상 보드는하는 ARMv7-A 아키텍처 및 Cortex-A9 코어를 기반으로합니다.

편집 :

질문 1 :__mcount_loc<__gnu_mcount_nc>에 상대 놓았습니다. 커널이 포인터의 어느 부분에 주소를 붙이는지를 어떻게 알 수 있습니까?

질문 2 : "해킹 된"커널 모듈이 작동하지 않는 것으로 보입니다. .ko 트리거 오류 메시지가 insmod 명령 발행 :

insmod 명령 :

내가 어떤에서 심볼 __gnu_mcount_nc을 제거해야합니까 알 수없는 기호 모듈 또는 유효하지 않은 매개 변수 : 'some_driver.ko'을 삽입 할 수 없습니다 섹션? 그것도 지금까지 사용하지 않더라도?

몇 가지 아이디어를 찾아 주셔서 감사합니다.

+0

코드를 수정하는 대신 모듈이 사용하는 실제 커널 기호가 포함되어 있으므로 재배치 테이블을보고 싶을 것입니다. –

+0

미안하지만 나는 그것을 얻지 못한다. 모듈에서 어떤 심볼이 사용되는지 알고 프로파일 링을 제외한 모든 것을 유지하고 싶습니다. __gnu_mcount_nc –

+0

명령 행에서'objdump -r '을 실행하면 모든 재배치 목록을 볼 수 있습니다. 기본적으로 모듈이로드 될 때, 커널은 재배치 목록을 스캔하여 모든'ebfffffe' 명령어를 실제 함수로 점프합니다. 그 생각은 여러분이 직접 재배치를 살펴보고'__gnu_mcount_nc'를 참조하는 것을 찾은 다음 그 재배치 엔트리를 제거 할 수 있다는 것입니다 (또한이 명령어가 가리키는 명령어를'nop' 나 그와 동등한 것으로 수정해야합니다). –

답변

0

FTRACE를 지원하는 커널을 다시 컴파일하고 CONFIG_DYNAMIC_FTRACE을 활성화해야합니다.

성능에 영향을 미치지 않아도됩니다. 실제로 추적을 사용하지 않으면 커널 로더가 __gnu_mcount_ncwill be NOPped out을 호출합니다. 이것은 __mcount_loc 섹션 (최종 .ko)의 내용입니다. 바이너리에서 bl __gnu_mcount_nc 호출의 모든 위치 목록이 있습니다.

+0

"성능이 좋은 이유"라고 말했지만, 커널 자체의 크기도 내 마음에있었습니다. 대략 170kB **가 FTRACE를 지원하지 않고 작았습니다. 플래시 메모리가 매우 부족하여 FTRACE를 비활성화하는 것이 좋습니다. 그래서 나는 모든 'BL <__ gnu_mcount_nc>'를'mov r8, r8 ''로 바꾸는 개념을 고수했습니다. 나는 모든 상대 포인터를'__mcount_loc'에서'__gnu_mcount_nc'로 가져 와서 지침을 바꾸었다. 이것은 성공적이었습니다 - 적어도 커널 모듈을 분해 한 후에 보았습니다. –

관련 문제