gdb disassemble/rs
để hiển thị nguồn và byte thô
Với định dạng này, nó thực sự gần với objdump -S
đầu ra:
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
C chính
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
Biên dịch và tháo rời
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Tháo rời:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Đã thử nghiệm trên Ubuntu 16.04, GDB 7.11.1.
objdump + awk giải pháp
In đoạn văn như đã đề cập tại: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -bản văn
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
ví dụ:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
chỉ đưa ra:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
Khi sử dụng -S
, tôi không nghĩ rằng có cách chống lỗi, vì các bình luận mã có thể chứa bất kỳ trình tự nào có thể xảy ra ... Nhưng những cách sau hầu như hoạt động mọi lúc:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
phỏng theo: Cách chọn các dòng giữa hai mẫu điểm đánh dấu có thể xảy ra nhiều lần với awk / sed
Thư trả lời danh sách gửi thư
Có một chuỗi năm 2010 trong danh sách gửi thư cho biết không thể thực hiện được: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Bên cạnh gdb
cách giải quyết do Tom đề xuất, họ cũng nhận xét về một cách giải quyết khác (tệ hơn) là biên dịch với cách -ffunction-section
đặt một chức năng cho mỗi phần và sau đó kết xuất phần đó.
Nicolas Clifton đã cung cấp cho nó một WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , có thể là do giải pháp GDB bao gồm trường hợp sử dụng đó.
static
, nó có thể được trình biên dịch đưa vào các site gọi của nó. Điều này có nghĩa có thể không thực sự có bất kỳ chức năng để tháo rời, cho mỗi gia nhập . Nếu bạn có thể phát hiện các ký hiệu cho các chức năng khác, nhưng không phải là chức năng bạn đang tìm kiếm, thì đây là một gợi ý mạnh mẽ rằng chức năng đã được nội tuyến. Valgrind vẫn có thể tham chiếu đến hàm được gạch trước ban đầu vì thông tin gỡ lỗi tệp ELF lưu trữ nơi bắt nguồn của từng lệnh riêng lẻ, ngay cả khi các hướng dẫn được chuyển đi nơi khác.