2013-12-11 21 views
14

Tôi đang cố gắng gỡ lỗi một vấn đề liên kết mà tôi có, khi viết hạt nhân.Kịch bản trình liên kết: chiến lược gỡ lỗi?

Vấn đề ở đây là tôi có một biến số SCAN_CODE_MAPPING mà tôi không thể sử dụng - nó có vẻ trống hoặc gì đó. Tôi có thể sửa lỗi này bằng cách thay đổi cách tôi liên kết chương trình của mình, nhưng tôi không biết tại sao.

Khi tôi nhìn vào bên trong tệp nhị phân được tạo bằng cách sử dụng objdump, dữ liệu cho biến chắc chắn là ở đó, vì vậy chỉ có một thứ gì đó bị hỏng với tham chiếu đến nó.

Here's a gist với cả tập lệnh liên kết và phần bảng biểu tượng khác nhau giữa hai tệp.

Điều làm tôi bối rối là cả hai bảng biểu tượng đều có cùng biểu tượng, chúng có cùng độ dài và chúng dường như chứa dữ liệu phù hợp. Sự khác biệt duy nhất mà tôi có thể thấy là chúng không theo thứ tự như nhau.

Cho đến nay tôi đã cố gắng

  • kiểm tra vị trí bộ nhớ SCAN_CODE_MAPPING để đảm bảo nó có dữ liệu tôi mong đợi và chưa được xóa trắng
  • kiểm tra rằng tất cả những biểu tượng đều giống nhau
  • kiểm tra xem tất cả nội dung có ký hiệu có cùng độ dài không
  • xem .data.rel.ro.local để đảm bảo rằng nó có địa chỉ của dữ liệu
.210

Một đầu mối có thể là cảnh báo này:

warning: uninitialized space declared in non-BSS section `.text': zeroing

mà tôi nhận được trong cả hai bị hỏng và các trường hợp chính xác.

Tôi nên thử gì tiếp theo?

+0

Bỏ phiếu để đóng như gỡ rối giúp đỡ. –

Trả lời

3

Bạn có thể nhận được nhiều thông tin hơn bằng cách sử dụng "đọc".

Đặc biệt, hãy nhìn vào các tiêu đề chương trình:

readelf chương trình -l

phần BSS của bạn là hoàn toàn khác so với cái tiêu chuẩn, mà có lẽ gây ra cảnh báo. Dưới đây là những gì mặc định trông giống như trên hệ thống của tôi:

.bss   : 
    { 
    *(.dynbss) 
    *(.bss .bss.* .gnu.linkonce.b.*) 
    *(COMMON) 
    /* Align here to ensure that the .bss section occupies space up to 
     _end. Align after .bss to ensure correct alignment even if the 
     .bss section disappears because there are no input sections. 
     FIXME: Why do we need it? When there is no .bss section, we don't 
     pad the .data section. */ 
    . = ALIGN(. != 0 ? 64/8 : 1); 
    } 

Nếu phần nhập không khớp với bất kỳ thứ gì trong tập lệnh liên kết của bạn, thì mối liên kết vẫn phải đặt nó ở đâu đó. Hãy chắc chắn rằng bạn đang bao gồm tất cả các phần đầu vào.

Lưu ý rằng có sự khác biệt giữa các phần và phân đoạn. Các phần được sử dụng bởi trình liên kết, nhưng điều duy nhất mà trình tải chương trình xem xét là các phân đoạn. Phân đoạn văn bản bao gồm phần văn bản, nhưng nó cũng bao gồm các phần khác. Các phần đi vào cùng một đoạn phải nằm liền kề. Vì vậy, trật tự không quan trọng.

Phần rodata thường đi sau phần văn bản. Đây là cả hai chỉ đọc trong khi thực hiện và sẽ hiển thị một lần trong tiêu đề chương trình của bạn như là một mục LOAD với đọc & quyền thực thi. Mục LOAD đó là đoạn văn bản.

Phần bss thường đi sau phần dữ liệu. Đây là cả hai có thể ghi trong khi thực hiện và sẽ hiển thị một lần trong tiêu đề chương trình của bạn như là một mục LOAD với quyền đọc & ghi. Mục LOAD đó là phân đoạn dữ liệu.

Nếu bạn thay đổi thứ tự, nó ảnh hưởng đến cách trình liên kết tạo tiêu đề chương trình. Tiêu đề chương trình, thay vì tiêu đề phần, được sử dụng khi tải chương trình của bạn trước khi thực thi nó. Đảm bảo kiểm tra tiêu đề chương trình khi sử dụng tập lệnh trình liên kết tùy chỉnh.

Nếu bạn có thể cung cấp thêm chi tiết cụ thể về những triệu chứng thực tế của bạn, thì sẽ dễ dàng hơn để trợ giúp.

+0

Đây không phải là vấn đề tôi gặp phải (tôi đã viết hạt nhân, do đó cấu trúc của tệp thực thi cuối cùng không quan trọng quá nhiều). Mặc dù vậy, thông tin hữu ích. – jvns

5

Vấn đề ở đây hóa ra là tôi đang viết hệ điều hành và chỉ 12k trong số đó đã được tải thay vì toàn bộ. Vì vậy, các kịch bản liên kết đã thực sự làm việc tốt.

Các công cụ chính tôi sử dụng để hiểu mã nhị phân là:

  • nm
  • objdump
  • readelf
Các vấn đề liên quan