시작 중에 처리되지 않은 신호 11과 7을 발생시키는 프로토타입 CPU를 디버깅하려고 합니다.
이것이 커널이 출력하는 내용입니다. 어떤 사용자 공간 프로세스에서 오류가 발생하는지 정확하게 디버깅하기 위해 추가 인쇄 문을 커널에 추가했습니다.
[ 0.880000] Execing: /usr/bin/readlink
[ 0.884000] readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000]
[ 0.884000] CPU: 0 PID: 85 Comm: readlink Not tainted 4.15.0-rc6-31580-g9c3074b5c2cd-dirty #20
[ 0.884000] sepc: 00000020000b8f60 ra : 00000020000b8d2c sp : 0000003ffffd9a60
[ 0.884000] gp : 00000000001028a8 tp : 0000002000192710 t0 : 0000000000000458
[ 0.884000] t1 : 00000020000aae98 t2 : ffffffffffffffff s0 : 000000200018d468
[ 0.884000] s1 : 000000200018e7d0 a0 : 000000200018e810 a1 : 000000200018c768
[ 0.884000] a2 : fffffffffbad2884 a3 : 0000000000008000 a4 : 000000200018ef38
[ 0.884000] a5 : 0000000000000001 a6 : 0000000000000000 a7 : 0000000000000040
[ 0.884000] s2 : 0000000000000001 s3 : 0000002000192010 s4 : 000000200018c4b0
[ 0.884000] s5 : 0000000000000001 s6 : 000000200018dd58 s7 : 0000000000000000
[ 0.884000] s8 : 00000000000e3388 s9 : 0000000000000040 s10: 000000000009c000
[ 0.884000] s11: 0000000000000048 t3 : 0000000000061e98 t4 : 0000000000000002
[ 0.884000] t5 : 000000200004bb64 t6 : 0000000000000000
[ 0.884000] sstatus: 8000000200006020 sbadaddr: 0000000006200893 scause: 0000000000000006
[ 0.888000] Execing: /bin/rm
여기에서는 일부 libc 기능을 실행하는 readlink에서 처리되지 않은 신호 7이 보입니다. 내 질문은 libc의 어떤 명령이 이 문제를 일으키는지 어떻게 확인할 수 있습니까? 기계 상태 인쇄물에는 지침이 없고 sepcs만 포함되어 있습니다. libc는 동적으로 연결되어 있으므로 libc 코드에서 이에 대한 참조를 찾는 방법을 잘 모르겠습니다.
답변1
커널의 소스 코드를 올바르게 읽으면 다음 줄이 표시됩니다.
readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000]
알아야 할 사항을 알려드립니다. libc는 길이 0x2000049000
가 바이트인 16진수로 로드됩니다 0x13e000
. 신호가 발생하는 주소는 입니다 0x00000020000b8f60
. libc와 관련하여 오류가 발생한 위치를 찾으려면 0x00000020000b8f60
- 를 계산하십시오 0x2000049000
.
알겠습니다. 0x6ff60
or에서 해당 위치를 찾아보세요.objdump -d libc...
nm -g libc...