Có cách nào — giống như xem kết quả xử lý trước với gcc -E
— để xem đối tượng của tôi trông như thế nào khi được biên dịch thành tệp đối tượng?Bố trí đối tượng được biên dịch
Tôi đang nói về GCC, nhưng giải pháp bao gồm MSVC sẽ ổn.
Có cách nào — giống như xem kết quả xử lý trước với gcc -E
— để xem đối tượng của tôi trông như thế nào khi được biên dịch thành tệp đối tượng?Bố trí đối tượng được biên dịch
Tôi đang nói về GCC, nhưng giải pháp bao gồm MSVC sẽ ổn.
Tệp đối tượng chứa dữ liệu nhị phân - mức cao nhất duy nhất mà hầu hết các trình biên dịch có thể xuất ra là trình biên dịch, vì vậy nếu bạn không thể đọc được rằng bạn đã hết may mắn. Tuy nhiên, hãy xem this question để biết thêm thông tin trong khu vực này.
Bạn có thể kiểm tra bố cục của tệp nhị phân và nội dung của chúng bằng cách sử dụng tệp bản đồ. Sử dụng /MAP
cho VC và -Map
hoặc --print-map
cho gcc.
Câu hỏi của bạn hơi khó hiểu.
Nếu bạn muốn xem kết quả xử lý trước bằng MSVC, bạn có thể sử dụng /E
, /P/
hoặc /EP
.
Có tùy chọn không có giấy tờ trong MSVC để hiển thị bố cục dữ liệu của cấu trúc và lớp học. Tôi đang gặp khó khăn khi tìm nó ngay bây giờ.
> Có một tùy chọn không có giấy tờ trong MSVC để hiển thị bố cục dữ liệu của cấu trúc và các lớp. Tôi đang gặp khó khăn khi tìm nó ngay bây giờ. đây chính xác là những gì tôi đang tìm kiếm! – user257620
Cuối cùng tôi đã cố gắng khai thác các thiết bị chuyển mạch đó: '/ d1reportSingleClassLayoutXXX' và'/d1reportAllClassLayout'. –
Đối với các tệp thi hành được biên dịch GCC, hãy kiểm tra Pahole. Nó sẽ chỉ cho bạn cách trình biên dịch trình bày các cấu trúc/lớp của bạn và liệu chúng có "lỗ hổng" trong chúng hay không. Lỗ được đệm do các quy tắc liên kết bộ nhớ.
(+1) công cụ naice –
liên kết pahole đã chết – ofloveandhate
@ofloveandhate Tôi đã sửa liên kết. – paxos1977
Một hàm tạo chỉ là một hàm khác (trừ khi nó nằm trong hàng). Các tệp đối tượng chứa rất nhiều thông tin cho trình liên kết; vì vậy bạn sẽ có thể tìm thấy hàm trong tệp .a (tên hàm sẽ bị xáo trộn).
Bạn có nghĩa là mã hoặc dữ liệu? –
Điểm tốt John. Hàm khởi tạo sẽ là mã và giống như tất cả mã thuộc về lớp, không phải là các đối tượng riêng lẻ. Do đó bạn sẽ không tìm thấy nó trong cách bố trí đối tượng. – MSalters
Bạn có thể sử dụng 'g ++ -S file.cpp' để lấy đầu ra của trình biên dịch trong' file.s'. Đây có phải là những gì bạn muốn? – msandiford