답변1
strip
바이너리 기호가 ped되었습니까? 그렇다면 기호 테이블도 없고 기호를 찾을 가능성도 없습니다. readelf
내 hello
바이너리는 여기를 통해 찾을 수 있습니다 .하다기호 테이블이 있습니다:
$ readelf -S hello | grep -i symtab
[28] .symtab SYMTAB 0000000000000000 000018f8
$
또한 GDB를 실행할 때 프로그램이 실제로 시작됩니까? 기호 테이블이 로드될 때까지 이 기호를 확인할 수 없는 것 같습니다. GDB를 처음 시작할 때는 로드되지 않지만, 클릭하면 로드되어야 합니다 main()
. main()
프로그램에 중단점을 배치 run
하고 main()
중단점에 도달하면 변수를 검사할 수 있습니다.
Reading symbols from hello...(no debugging symbols found)...done.
(gdb) x/s *((char **)environ)
No symbol table is loaded. Use the "file" command.
(gdb) b main
Breakpoint 1 at 0x4005c8
(gdb) r
Starting program: /home/ubuntu/hello
Breakpoint 1, 0x00000000004005c8 in main ()
(gdb) x/s *((char **)environ)
0x7fffffffe38f: "XDG_VTNR=7"
(gdb)
답변2
에서 gdb
명령을 사용할 수 있습니다 show environment
. 프로세스 환경을 점검하는 대안은 다음과 같습니다.
$ sed 's/\x0/\n/g' /proc/<PID>/environ
이 sed
명령은 가독성을 높이기 위해 NUL 구분 기호를 줄 바꿈으로 변환하는 데 필요합니다.
두 접근 방식의 장점(간단함 외에도)은 기호 테이블이 삭제되어도 문제가 되지 않는다는 것입니다. :-)