일부 주변 장치에 대한 바이너리 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'을 삽입 할 수 없습니다 섹션? 그것도 지금까지 사용하지 않더라도?
몇 가지 아이디어를 찾아 주셔서 감사합니다.
코드를 수정하는 대신 모듈이 사용하는 실제 커널 기호가 포함되어 있으므로 재배치 테이블을보고 싶을 것입니다. –
미안하지만 나는 그것을 얻지 못한다. 모듈에서 어떤 심볼이 사용되는지 알고 프로파일 링을 제외한 모든 것을 유지하고 싶습니다. __gnu_mcount_nc –
명령 행에서'objdump -r'을 실행하면 모든 재배치 목록을 볼 수 있습니다. 기본적으로 모듈이로드 될 때, 커널은 재배치 목록을 스캔하여 모든'ebfffffe' 명령어를 실제 함수로 점프합니다. 그 생각은 여러분이 직접 재배치를 살펴보고'__gnu_mcount_nc'를 참조하는 것을 찾은 다음 그 재배치 엔트리를 제거 할 수 있다는 것입니다 (또한이 명령어가 가리키는 명령어를'nop' 나 그와 동등한 것으로 수정해야합니다). –