2014-10-22 21 views
5

Tôi đã đọc Effective C++, 3rd edition và trong mục 2 (thích const, enums, và inlines để # định nghĩa), Scott Meyers đề cập đến bảng biểu tượng: ông giải thích rằng #defines có thể không xuất hiện trong bảng biểu tượng .Symbol Bảng được tạo ra bởi C++

Dựa trên câu trả lời here, một chút đề xuất reading và bài viết Wikipedia, tôi sẽ xác định bảng biểu tượng như sau: vì trình biên dịch chỉ tạo tệp đối tượng cho mọi đơn vị dịch, chúng tôi vẫn cần một cách biểu tượng tham chiếu giữa các đơn vị dịch. Điều này được thực hiện bằng cách sử dụng một bảng được tạo cho mọi tệp đối tượng để biểu tượng có thể được định nghĩa ở giai đoạn sau - bởi trình liên kết khi thư mục thực thi/được tạo từ các tệp đối tượng. Trong quá trình liên kết, các ký hiệu được thay thế bằng địa chỉ bộ nhớ thích hợp của chúng bằng trình liên kết.

Dưới đây là những gì tôi muốn biết:

  • là giải thích của tôi ở trên có đúng không?
  • Sau khi liên kết, khi địa chỉ bộ nhớ đã được giải quyết, tôi không nghĩ rằng bảng biểu tượng là bắt buộc? Đó là, tôi nghĩ rằng bảng biểu tượng sẽ không có sẵn trong thư viện thực thi /; đúng không?
  • Tôi nghi ngờ rằng bảng biểu tượng cũng hữu ích cho các tác vụ biên dịch khác? Một cái gì đó giống như xác định xung đột đặt tên có lẽ?
  • Bảng biểu tượng được mô tả ở trên không giống như export table. Trong ngữ cảnh của Visual C++ ít nhất, bảng xuất khẩu xác định các ký hiệu được khai báo rõ ràng bên ngoài thư viện. Tôi cho rằng theo một nghĩa nào đó, đây là một bảng biểu tượng - nhưng không liên quan đến bảng ký hiệu mà Scott đang đề cập đến.
  • Có điều gì thú vị khác về bảng biểu tượng không? Nghĩa là, có thêm thông tin chi tiết nào về các bảng biểu tượng mà tôi nên có không?

Cảm ơn bạn đã dành thời gian và đóng góp.

bảng

Trả lời

5

Symbol tồn tại cả hai cho trình biên dịch (và sau đó biên dịch sẽ đặt những biểu tượng biến thậm chí địa phương trong họ; ngay cả những preprocessor có một số loại bảng biểu tượng cho #define tên -d, nhưng tiền xử lý có thể là bên trong trình biên dịch hiện nay) và cho trình liên kết. Nhưng đây là những bảng khác nhau, được tổ chức khác nhau.

Bảng biểu tượng trình liên kết chủ yếu dành cho các biểu tượng toàn cầu được xuất hoặc nhập. Hãy lưu ý rằng linker thực hiện một số relocation. Lưu ý rằng trình liên kết hoạt động khá khác nhau trên Windows và trên Linux (dllimport trên Windows, __attribute__(visibility...) trên Linux). Lưu ý rằng đối với các thư viện động, một số liên kết xảy ra khi chạy (dynamic loading). Đối với C++, name mangling có thể xảy ra. Đọc cũng về vague linkage & template instantiation & link-time optimization trong GCC ...

đọc cũng Levine's book: Linkers and Loaders và ví dụ wikipage trên định dạng ELF (được sử dụng cho các tệp đối tượng, thư viện được chia sẻ và tệp thực thi trên Linux và nhiều hệ thống Unix).

Nếu bạn có quyền truy cập vào một số hệ thống Linux, hãy sử dụng các tiện ích readelf(1), nm(1)objdump(1).Đọc thêm Drepper's paper: How To Write Shared Libraries (trên Linux)

Các vấn đề liên quan