Giải thích lệnh objdump của Linux cho người mới bắt đầu (7 ví dụ)

theanh

Administrator
Nhân viên
Nếu bạn đang lập trình trên Linux và công việc của bạn xoay quanh trình biên dịch, có một số tiện ích dòng lệnh mà bạn nên biết. Một trong những công cụ như vậy là objdump. Trong hướng dẫn này, chúng ta sẽ thảo luận về những điều cơ bản của lệnh này bằng một số ví dụ dễ hiểu.

Nhưng trước khi thực hiện, cần lưu ý rằng tất cả các ví dụ ở đây đều đã được thử nghiệm trên máy Ubuntu 20.04 LTS và trên Debian 10.

Lệnh objdump của Linux​

Lệnh objdump trong Linux, như tên gọi của nó, hiển thị thông tin từ các tệp đối tượng. Sau đây là cú pháp của công cụ:
Mã:
objdump OPTIONS objfile ...
Và đây là nội dung trang hướng dẫn nói về nó:
Mã:
objdump hiển thị thông tin về một hoặc nhiều tệp đối tượng. Các tùy chọn kiểm soát thông tin cụ thể nào sẽ hiển thị. Thông tin này chủ yếu hữu ích với các lập trình viên đang làm việc trên 
các công cụ biên dịch, trái ngược với các lập trình viên chỉ muốn chương trình của họ biên dịch và hoạt động.

objfile... là các tệp đối tượng cần được kiểm tra. Khi bạn chỉ định các tệp lưu trữ, objdump sẽ hiển thị 
thông tin về từng tệp đối tượng thành viên.
Sau đây là một số ví dụ theo kiểu Hỏi & Đáp sẽ giúp bạn hiểu rõ hơn về cách objdump hoạt động.

Câu hỏi 1. Làm thế nào để objdump hiển thị nội dung tiêu đề tệp?​

Bạn có thể thực hiện việc này bằng tùy chọn dòng lệnh -f.

Ví dụ:
Mã:
objdump -f /bin/ls
Và đây là đầu ra của lệnh trên:
Mã:
/bin/ls: định dạng tệp elf64-x86-64
kiến trúc: i386:x86-64, cờ 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
địa chỉ bắt đầu 0x0000000000067d0
Vì vậy, bạn có thể thấy nội dung tiêu đề của 'ls' được hiển thị trong đầu ra.

Câu hỏi 2. Làm thế nào để objdump hiển thị nội dung tiêu đề tệp theo định dạng đối tượng?​

Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -p. Ví dụ, lệnh sau:
Mã:
objdump -p /bin/ls
Tạo ra kết quả sau:
Mã:
/bin/ls: file format elf64-x86-64

Tiêu đề chương trình:
 PHDR tắt 0x0000000000000040 vaddr 0x00000000000000040 paddr 0x0000000000000040 align 2**3
 filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
 INTERP tắt 0x0000000000000238 vaddr 0x0000000000000238 paddr 0x00000000000000238 căn chỉnh 2**0
 filesz 0x0000000000000001c memsz 0x0000000000000001c cờ r--
 TẢI TẮT 0x000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 căn chỉnh 2**21
 filesz 0x000000000001e6e8 memsz 0x000000000001e6e8 cờ r-x
 TẢI TẮT 0x000000000001eff0 vaddr 0x00000000000021eff0 paddr 0x000000000021eff0 căn chỉnh 2**21
 filesz 0x0000000000001278 memsz 0x0000000000002570 cờ rw-
Tắt ĐỘNG 0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 căn chỉnh 2**3
 filesz 0x000000000000200 memsz 0x000000000000200 cờ rw-
Tắt LƯU Ý 0x0000000000000254 vaddr 0x000000000000254 paddr 0x0000000000000254 căn chỉnh 2**2
 filesz 0x0000000000000044 memsz 0x0000000000000044 cờ r--
Tắt EH_FRAME 0x000000000001b1a0 vaddr 0x0000000000001b1a0 paddr 0x000000000001b1a0 căn chỉnh 2**2
 filesz 0x0000000000000884 memsz 0x0000000000000884 cờ r--
Tắt STACK 0x000000000000000 vaddr 0x0000000000000000 paddr 0x00000000000000000 căn chỉnh 2**4
 filesz 0x0000000000000000 memsz 0x0000000000000000 cờ rw-
 RELRO tắt 0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 căn chỉnh 2**0
 filesz 0x0000000000001010 memsz 0x0000000000001010 cờ r--

Phần động:
 CẦN libselinux.so.1
 CẦN libc.so.6
 INIT 0x0000000000003758
 FINI 0x0000000000001636c
 INIT_ARRAY 0x0000000000021eff0
 INIT_ARRAYSZ 0x0000000000000008
 FINI_ARRAY 0x00000000000021eff8
 FINI_ARRAYSZ 0x000000000000008
 GNU_HASH 0x0000000000000298
 STRTAB 0x0000000000001180
 SYMTAB 0x0000000000000388
 STRSZ 0x0000000000000682
 SYMENT 0x0000000000000018
 GỠ LỖI 0x0000000000000000
 PLTGOT 0x000000000021fc38
 PLTRELSZ 0x0000000000000a68
 PLTREL 0x0000000000000007
 JMPREL 0x0000000000002cf0
 RELA 0x00000000000019a0
 RELASZ 0x0000000000001350
 RELAENT 0x0000000000000018
 FLAGS 0x0000000000000008000001
 VERNEED 0x00000000000001930
 VERNEEDNUM 0x0000000000000001
 VERSYM 0x00000000000001802
 RELACOUNT 0x0000000000000c1

Tham chiếu phiên bản:
 bắt buộc từ libc.so.6:
 0x06969194 0x00 07 GLIBC_2.14
 0x0d696914 0x00 06 GLIBC_2.4
 0x06969197 0x00 05 GLIBC_2.17
 0x09691974 0x00 04 GLIBC_2.3.4
 0x09691a75 0x00 03 GLIBC_2.2.5
 0x0d696913 0x00 02 GLIBC_2.3

Câu hỏi 3. Làm thế nào để objdump hiển thị nội dung của tiêu đề phần?​

Có thể thực hiện việc này bằng tùy chọn dòng lệnh -h. Ví dụ, lệnh sau:
Mã:
objdump -h /bin/ls
tạo ra kết quả đầu ra sau trên hệ thống của tôi:
Mã:
/bin/ls: định dạng tệp elf64-x86-64

Các phần:
Idx Tên Kích thước VMA LMA Tắt tệp Algn
 0 .interp 0000001c 000000000000238 000000000000238 00000238 2**0
 MỤC LỤC, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 1 .note.ABI-tag 00000020 0000000000000254 0000000000000254 00000254 2**2
 NỘI DUNG, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 2 .note.gnu.build-id 00000024 0000000000000274 0000000000000274 00000274 2**2
 NỘI DUNG, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 3 .gnu.hash 000000ec 000000000000298 0000000000000298 00000298 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 4 .dynsym 00000df8 0000000000000388 0000000000000388 00000388 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 5 .dynstr 00000682 0000000000001180 0000000000001180 00001180 2**0
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 6 .gnu.version 0000012a 0000000000001802 0000000000001802 00001802 2**1
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 7 .gnu.version_r 00000070 0000000000001930 0000000000001930 00001930 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 8 .rela.dyn 00001350 00000000000019a0 00000000000019a0 000019a0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 9 .rela.plt 00000a68 0000000000002cf0 0000000000002cf0 00002cf0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
10 .init 00000017 0000000000003758 0000000000003758 00003758 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
11 .plt 00000700 0000000000003770 000000000003770 00003770 2**4
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
12 .plt.got 00000018 0000000000003e70 0000000000003e70 00003e70 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
13 .text 000124d9 0000000000003e90 000000000003e90 00003e90 2**4
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
14 .fini 00000009 000000000001636c 000000000001636c 0001636c 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
15 .rodata 00004e1d 0000000000016380 0000000000016380 00016380 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
16 .eh_frame_hdr 00000884 000000000001b1a0 000000000001b1a0 0001b1a0 2**2
 NỘI DUNG, PHỔ BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
17 .eh_frame 00002cc0 000000000001ba28 000000000001ba28 0001ba28 2**3
 NỘI DUNG, PHỔ BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
18 .init_array 00000008 000000000021eff0 000000000021eff0 0001eff0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
19 .fini_array 00000008 000000000021eff8 000000000021eff8 0001eff8 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
21 .dynamic 00000200 000000000021fa38 000000000021fa38 0001fa38 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
22 .got 000003c8 000000000021fc38 000000000021fc38 0001fc38 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
23 .data 00000268 000000000220000 0000000000220000 00020000 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
24 .bss 000012e0 0000000000220280 0000000000220280 00020268 2**5
 ALLOC
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 00020268 2**2
 NỘI DUNG, CHỈ ĐỌC

Câu hỏi 4. Làm thế nào để objdump hiển thị tất cả các tiêu đề?​

Để objdump hiển thị tất cả các tiêu đề, hãy sử dụng tùy chọn dòng lệnh -x.
Mã:
objdump -x /bin/ls
Sau đây là kết quả đầu ra mà lệnh này tạo ra trên hệ thống của tôi:
Mã:
/bin/ls: định dạng tệp elf64-x86-64
/bin/ls
kiến trúc: i386:x86-64, cờ 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
địa chỉ bắt đầu 0x00000000000005850

Tiêu đề chương trình:
 Tắt PHDR 0x0000000000000040 vaddr 0x0000000000000040 paddr 0x0000000000000040 căn chỉnh 2**3
 filesz 0x00000000000001f8 memsz 0x00000000000001f8 cờ r-x
 Tắt INTERP 0x0000000000000238 vaddr 0x00000000000000238 paddr 0x00000000000000238 căn chỉnh 2**0
 filesz 0x0000000000000001c memsz 0x0000000000000001c cờ r--
 TẢI TẮT 0x000000000000000 vaddr 0x00000000000000000 paddr 0x0000000000000000 căn chỉnh 2**21
 filesz 0x0000000000001e6e8 memsz 0x0000000000001e6e8 cờ r-x
 LOAD tắt 0x00000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 căn chỉnh 2**21
 filesz 0x0000000000001278 memsz 0x0000000000002570 cờ rw-
DYNAMIC tắt 0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 căn chỉnh 2**3
 filesz 0x000000000000200 memsz 0x000000000000200 cờ rw-
 NOTE tắt 0x0000000000000254 vaddr 0x00000000000000254 paddr 0x00000000000000254 căn chỉnh 2**2
 filesz 0x0000000000000044 memsz 0x0000000000000044 cờ r--
EH_FRAME tắt 0x000000000001b1a0 vaddr 0x0000000000001b1a0 paddr 0x000000000001b1a0 căn chỉnh 2**2
 filesz 0x0000000000000884 memsz 0x0000000000000884 cờ r--
 STACK tắt 0x0000000000000000 vaddr 0x00000000000000000 paddr 0x00000000000000000 căn chỉnh 2**4
 filesz 0x0000000000000000 memsz 0x0000000000000000 cờ rw-
 RELRO tắt 0x000000000001eff0 vaddr 0x0000000000021eff0 paddr 0x000000000021eff0 căn chỉnh 2**0
 filesz 0x0000000000001010 memsz 0x0000000000001010 cờ r--

Phần động:
 CẦN libselinux.so.1
 CẦN libc.so.6
 INIT 0x0000000000003758
 FINI 0x000000000001636c
 INIT_ARRAY 0x0000000000021eff0
 INIT_ARRAYSZ 0x0000000000000008
 FINI_ARRAY 0x00000000000021eff8
 FINI_ARRAYSZ 0x000000000000021eff8
 FINI_ARRAYSZ 0x0000000000000008
 GNU_HASH 0x0000000000000298
 STRTAB 0x0000000000001180
 SYMTAB 0x0000000000000388
 STRSZ 0x0000000000000682
 SYMENT 0x0000000000000018
 GỠ LỖI 0x0000000000000000
 PLTGOT 0x0000000000021fc38
 PLTRELSZ 0x0000000000000a68
 PLTREL 0x0000000000000007
 JMPREL 0x0000000000002cf0
 RELA 0x00000000000019a0
 RELASZ 0x0000000000001350
 RELAENT 0x0000000000000018
 FLAGS 0x0000000000000008
 FLAGS_1 0x0000000008000001
 VERNEED 0x0000000000001930
 VERNEEDNUM 0x0000000000000001
 VERSYM 0x0000000000001802
 RELACOUNT 0x0000000000000c1

Tham chiếu phiên bản:
 bắt buộc từ libc.so.6:
 0x06969194 0x00 07 GLIBC_2.14
 0x0d696914 0x00 06 GLIBC_2.4
 0x06969197 0x00 05 GLIBC_2.17
 0x09691974 0x00 04 GLIBC_2.3.4
 0x09691a75 0x00 03 GLIBC_2.2.5
 0x0d696913 0x00 02 GLIBC_2.3

Các phần:
IDx Tên Kích thước VMA LMA Tắt tệp Thuật toán
 0 .interp 0000001c 0000000000000238 0000000000000238 00000238 2**0
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 1 .note.ABI-tag 00000020 000000000000254 0000000000000254 00000254 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 2 .note.gnu.build-id 00000024 0000000000000274 000000000000274 00000274 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 3 .gnu.hash 000000ec 0000000000000298 0000000000000298 00000298 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 4 .dynsym 00000df8 0000000000000388 000000000000388 00000388 2**3
 NỘI DUNG, PHỤC VỤ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 5 .dynstr 00000682 0000000000001180 0000000000001180 00001180 2**0
 NỘI DUNG, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 6 .gnu.version 0000012a 0000000000001802 0000000000001802 00001802 2**1
 NỘI DUNG, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 7 .gnu.version_r 00000070 0000000000001930 0000000000001930 00001930 2**3
 NỘI DUNG, ALLOC, TẢI, CHỈ ĐỌC, DỮ LIỆU
 8 .rela.dyn 00001350 00000000000019a0 00000000000019a0 000019a0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
 9 .rela.plt 00000a68 0000000000002cf0 0000000000002cf0 00002cf0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
10 .init 00000017 0000000000003758 0000000000003758 00003758 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
11 .plt 00000700 0000000000003770 0000000000003770 00003770 2**4
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
12 .plt.got 00000018 0000000000003e70 000000000003e70 00003e70 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
13 .text 000124d9 000000000003e90 000000000003e90 00003e90 2**4
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
14 .fini 00000009 000000000001636c 000000000001636c 0001636c 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, MÃ
15 .rodata 00004e1d 0000000000016380 0000000000016380 00016380 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
16 .eh_frame_hdr 00000884 000000000001b1a0 000000000001b1a0 0001b1a0 2**2
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
17 .eh_frame 00002cc0 0000000000001ba28 000000000001ba28 0001ba28 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, CHỈ ĐỌC, DỮ LIỆU
18 .init_array 00000008 000000000021eff0 00000000021eff0 0001eff0 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
19 .fini_array 00000008 00000000021eff8 00000000021eff8 0001eff8 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
21 .dynamic 00000200 000000000021fa38 000000000021fa38 0001fa38 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
22 .got 000003c8 00000000021fc38 00000000021fc38 0001fc38 2**3
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
23 .data 00000268 0000000000220000 0000000000220000 00020000 2**5
 NỘI DUNG, PHÂN BỔ, TẢI, DỮ LIỆU
24 .bss 000012e0 0000000000220280 0000000000220280 00020268 2**5
 PHÂN BỔ
25 .gnu_debuglink 00000034 000000000000000 00000000000000 00020268 2**2
 NỘI DUNG, CHỈ ĐỌC
BẢNG KÝ HIỆU:
không có ký hiệu

Câu hỏi 5. Làm thế nào để objdump hiển thị nội dung của các phần thực thi trong trình biên dịch?​

Để thực hiện việc này, hãy sử dụng tùy chọn dòng lệnh -d. Sau đây là một ví dụ cho thấy tùy chọn này đang hoạt động:
Mã:
objdump -d /bin/ls
Và đây là một đoạn trích từ đầu ra:
Mã:
/bin/ls: định dạng tệp elf64-x86-64


Phân tách phần .init:

0000000000003758 :
 3758: 48 83 ec 08 sub $0x8,%rsp
 375c: 48 8b 05 7d c8 21 00 mov 0x21c87d(%rip),%rax # 21ffe0 
 3763: 48 85 c0 test %rax,%rax
 3766: 74 02 je 376a 
 3768: ff d0 callq *%rax
 376a: 48 83 c4 08 add $0x8,%rsp
 376e: c3 retq 

Tháo rời phần .plt:

0000000000003770 :
 3770: ff 35 ca c4 21 00 pushq 0x21c4ca(%rip) # 21fc40 
 3776: ff 25 cc c4 21 00 jmpq *0x21c4cc(%rip) # 21fc48 
 377c: 0f 1f 40 00 nopl 0x0(%rax)

0000000000003780 :
 3780: ff 25 ca c4 21 00 jmpq *0x21c4ca(%rip) # 21fc50 
 3786: 68 00 00 00 00 pushq $0x0
 378b: e9 e0 ff ff ff jmpq 3770 

0000000000003790 :
 3790: ff 25 c2 c4 21 00 jmpq *0x21c4c2(%rip) # 21fc58 
 3796: 68 01 00 00 00 pushq $0x1
 379b: e9 d0 ff ff ff jmpq 3770 

00000000000037a0 :
 37a0: ff 25 ba c4 21 00 jmpq *0x21c4ba(%rip) # 21fc60 
 37a6: 68 02 00 00 00 pushq $0x2
Tương tự, bạn có thể sử dụng tùy chọn dòng lệnh -D để làm cho objdump hiển thị nội dung trình biên dịch của tất cả các phần và tùy chọn -S để đảm bảo công cụ trộn lẫn mã nguồn với quá trình phân tách.

Câu hỏi 6. Làm thế nào để objdump hiển thị thông tin gỡ lỗi?​

Có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -S.
Mã:
objdump -g /bin/ls
Sau đây là một đoạn trích từ đầu ra do lệnh này tạo ra:
Mã:
Nội dung của phần .eh_frame (được tải từ /bin/ls):


00000000 000000000000014 000000000 Phiên bản CIE
: 1
 Mở rộng: "zR"
 Hệ số căn chỉnh mã: 1
 Hệ số căn chỉnh dữ liệu: -8
 Cột địa chỉ trả về: 16
 Dữ liệu mở rộng: 1b
 DW_CFA_def_cfa: r7 (rsp) ofs 8
 DW_CFA_offset: r16 (rip) tại cfa-8
 DW_CFA_undefined: r16 (rip)

00000018 0000000000000014 0000001c FDE cie=00000000 pc=0000000000005850..0000000000000587b
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop
 DW_CFA_nop

00000030 000000000000014 00000000 Phiên bản CIE
: 1
 Mở rộng: "zR"
 Hệ số căn chỉnh mã: 1
 Hệ số căn chỉnh dữ liệu: -8
 Cột địa chỉ trả về: 16
 Dữ liệu tăng cường: 1b
 DW_CFA_def_cfa: r7 (rsp) ofs 8
 DW_CFA_offset: r16 (rip) tại cfa-8

Câu hỏi 7. Làm thế nào để objdump hiển thị nội dung của bảng ký hiệu?​

Có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -t.
Mã:
objdump -t /bin/ls

Kết luận​

Chúng ta mới chỉ khám phá được bề nổi ở đây, vì lệnh objdump cung cấp rất nhiều tùy chọn dòng lệnh. Sau khi thực hành xong, bạn có thể tìm hiểu thêm về công cụ này bằng cách truy cập trang hướng dẫn của công cụ đó.
 
Back
Bên trên