Tôi đang cố gắng sử dụng GDB để gỡ lỗi zImage hạt nhân Linux trước khi nó được giải nén. Hạt nhân đang chạy trên một mục tiêu ARM và tôi có một trình gỡ lỗi JTAG kết nối với nó với một máy chủ GDB sơ khai. Mục tiêu phải tải bộ nạp khởi động. Trình tải khởi động đọc hình ảnh hạt nhân từ flash và đặt nó vào RAM tại 0x20008000
, sau đó rẽ nhánh vào vị trí đó.Gỡ lỗi giai đoạn giải nén hạt nhân Linux
Tôi đã bắt đầu GDB và kết nối với mục tiêu từ xa, sau đó tôi sử dụng lệnh GDB của add-symbol-file
như vậy:
add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
Khi tôi đặt một breakpoint cho địa chỉ đó, nó làm cái bẫy tại địa điểm chính xác - ngay khi nó nhánh cho hạt nhân. Tuy nhiên, GDB hiển thị sai dòng từ nguồn của arch/arm/boot/compressed/head.S
. Đó là 4 dòng phía sau. Làm thế nào tôi có thể sửa lỗi này?
Tôi cũng đã thử thêm tùy chọn -s section addr
vào add-symbol-file
với -s .start 0x20008000
; điều này dẫn đến chính xác cùng một vấn đề.
Trước tiên hãy đảm bảo bạn có gcc và gdb tương thích, tốt nhất là từ cùng phiên bản toolchain. Ngoài ra, biết rằng hạt nhân Linux được biên dịch với -O2 vì vậy một số dòng được tối ưu hóa. Bạn có chắc chắn không có bất kỳ từ khóa .align nào đó ở đâu đó không? –
Mã giải nén là tất cả các máy tính có liên quan. Nó thậm chí có thể sao chép chính nó từ một khu vực khác. Bộ nạp khởi động có thể đặt nó ở nơi mà đích được giải nén là; vì vậy nó phải tự di chuyển. Tôi nghi ngờ rằng bạn sẽ có thời gian tốt bằng cách sử dụng JTAG với các biểu tượng cố định. Tôi không biết nếu bạn có thể * di dời * với GDB bằng cách nào đó. –