2012-07-17 42 views
6

Bất kỳ cách nào để lấy địa chỉ hướng dẫn? Tôi đã cố gắng sử dụng để dán nhãn hướng dẫn và lấy địa chỉ của nhãn nhưng có vẻ như nó chỉ hoạt động trong trình biên dịch GCC với toán tử & &. (Tham khảo: this article) Điều gì sẽ xảy ra nếu các trình biên dịch khác?Nhận địa chỉ của hướng dẫn trong C/C++

Bất kỳ suy nghĩ nào về câu hỏi này?

+0

Tại sao bạn hỏi? –

+4

C++ không bắt buộc phải được thực hiện với hướng dẫn. –

+0

Hi Basile, tôi hiện đang thực hiện một số nghiên cứu về các tính năng chỉ dẫn/xem dữ liệu. – nigong

Trả lời

4

Tôi không chắc chắn rằng các tiêu chuẩn ngôn ngữ C hoặc C++ nói về hướng dẫn; bạn có thể hình dung chạy một chương trình C được biên dịch để được thực hiện bởi một nhóm lớn nô lệ của con người (nhưng điều đó sẽ là phi đạo đức, ngay cả khi tuân thủ tiêu chuẩn). Bạn có thể tự mình chạy một chương trình nhỏ đơn giản bằng bút chì và giấy, bạn có thể sử dụng trình thông dịch C, v.v. ...

Trình biên dịch C hoặc C++ tối ưu cũng sẽ dịch một số câu lệnh C thành nhiều lệnh máy nằm ở những nơi khác nhau (đặc biệt, các trình biên dịch thực hiện các chức năng nội dòng hoặc sao chép hoặc thậm chí là các khối cơ bản, ngay cả khi không có bất kỳ từ khóa inline nào trong mã nguồn).

Trên hầu hết hệ thống, bạn có thể viết mã (ví dụ trong lắp ráp) một thường trình trả về khi con trỏ đánh giá địa chỉ trả về của nó (tức là địa chỉ của người gọi).

Với GCC (và trình biên dịch tương thích, có lẽ là Clang/LLVM), bạn có thể sử dụng __builtin_return_address và các nội trang có liên quan.

Gnu Libc trên Linux cung cấp cho bạn backtrace (nhưng tôi đã được diappointed bởi nó, khi tôi cố gắng).

Chú ý rằng những thủ thuật có thể không hoạt động khi biên dịch với -fno-frame-pointer

Bạn cũng có thể xem xét tùy GCC ví dụ với các plugin hoặc các tiện ích mở rộng MELT (MELT là một ngôn ngữ cụ thể của miền, được triển khai như một plugin GPLv3 cho GCC, để mở rộng GCC dễ dàng hơn với các plugin được mã hóa trong C). GCC được tùy chỉnh của bạn có thể chèn các cuộc gọi đến các chức năng thiết bị đo đạc ở những nơi thích hợp.

+0

Hi Basile, cảm ơn câu trả lời của bạn. Nhưng tôi không có ý nói về mối quan hệ của chỉ thị và tuyên bố. Những gì tôi muốn làm là chỉ nhận được địa chỉ của một tuyên bố hoặc hướng dẫn trong C/C++. :) – nigong

+1

@nigong Anh ấy về cơ bản nói rằng có thể thậm chí không có chỉ dẫn nào cả. Đặc biệt là nếu nó được chạy bởi nô lệ chứ không phải là một CPU. – Mysticial

+1

Nếu 'hướng dẫn' và 'tuyên bố' là các khái niệm tương tự, điều này có thể khả thi. Tuy nhiên, hầu hết các câu lệnh tạo ra nhiều lệnh, có thể thậm chí không liên tiếp (cấu trúc vòng lặp, vv) và có thể xen kẽ (tối ưu hóa, lập lịch trình lệnh) với các lệnh từ các câu lệnh khác. – twalberg

0

Cấu trúc C hoặc C++ chuẩn duy nhất thậm chí gần với địa chỉ của lệnh là con trỏ hàm, mà tôi cho rằng đó không phải là ý của bạn. Tuy nhiên, bạn có thể thực hiện hầu hết những gì bạn có thể làm với giá trị nhãn gcc bằng cách sử dụng con trỏ thay thế cho các hàm có chứa các khối mã cần thiết.

Không có tùy chọn nào khác trong C/C++.

2

Chú ý: Way out of the box ở đây ..

Bạn có thể có các mối liên kết tạo ra một tập tin bản đồ có chứa các địa chỉ (tương đối hay cách khác) của các ứng dụng đối tượng (chức năng và dữ liệu)? Sau đó, ứng dụng của bạn có thể phân tích cú pháp tệp bản đồ liên kết đơn giản ...

+0

Trên Linux, 'dladdr' làm điều đó cho bạn-xem '' và 'dlopen') hoặc ít nhất cũng giúp ích rất nhiều. –

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