Lệnh nm trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh nm của Linux, được sử dụng để hiển thị thông tin symbol cho các file object. Lệnh nm là một công cụ hữu ích cho các nhà phát triển và các systemadmin để hiểu cấu trúc bên trong của các file thực thi. Chúng ta sẽ học cách sử dụng lệnh nm để hiển thị thông tin symbol, lọc kết quả đầu ra và hiểu rõ hơn về cấu trúc của một chương trình thực thi.

Lab này bao gồm các bước sau: Giới thiệu về Lệnh nm, Hiển thị Thông tin Symbol của một File Thực thi và Lọc Thông tin Symbol Sử dụng các Tùy chọn nm. Các bước này sẽ cung cấp một sự hiểu biết toàn diện về lệnh nm và các ứng dụng thực tế của nó trong phát triển phần mềm và các tác vụ quản trị hệ thống.

Giới thiệu về Lệnh nm

Trong bước này, chúng ta sẽ khám phá lệnh nm của Linux, được sử dụng để hiển thị thông tin symbol cho các file object. Lệnh nm là một công cụ hữu ích cho các nhà phát triển và các systemadmin để hiểu cấu trúc bên trong của các file thực thi.

Đầu tiên, hãy tạo một chương trình C đơn giản và biên dịch nó thành một file thực thi:

cd ~/project
nano hello.c

Thêm đoạn code sau vào file hello.c:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Bây giờ, hãy biên dịch chương trình:

gcc -o hello hello.c

Để xem thông tin symbol của file thực thi hello, chúng ta có thể sử dụng lệnh nm:

nm hello

Ví dụ kết quả:

0000000000001119 T main
                 U printf

Kết quả đầu ra cho thấy file thực thi hello có một symbol tên là main tại địa chỉ 0x0000000000001119, và nó cũng tham chiếu đến symbol printf, có khả năng được cung cấp bởi thư viện chuẩn C.

Lệnh nm cung cấp nhiều tùy chọn khác nhau để tùy chỉnh kết quả đầu ra và lọc thông tin symbol. Chúng ta sẽ khám phá các tùy chọn này trong bước tiếp theo.

Hiển thị Thông tin Symbol của một File Thực thi

Trong bước này, chúng ta sẽ khám phá các tùy chọn khác nhau của lệnh nm để hiển thị thông tin symbol chi tiết hơn cho file thực thi hello mà chúng ta đã tạo ở bước trước.

Đầu tiên, hãy xem xét kỹ hơn kết quả đầu ra của lệnh nm cơ bản:

nm hello

Ví dụ kết quả:

0000000000001119 T main
                 U printf

Kết quả đầu ra hiển thị tên symbol và địa chỉ của nó trong file thực thi. Chữ T chỉ ra rằng main là một hàm toàn cục và U có nghĩa là printf là một symbol chưa được định nghĩa, có khả năng được cung cấp bởi một thư viện bên ngoài.

Để có được thông tin chi tiết hơn, chúng ta có thể sử dụng các tùy chọn nm sau:

  • nm -A hello: Hiển thị tên file cùng với thông tin symbol.
  • nm -n hello: Sắp xếp kết quả đầu ra theo tên symbol thay vì địa chỉ.
  • nm -p hello: Hiển thị kết quả đầu ra ở định dạng dễ đọc hơn, đã được xử lý sau.
  • nm -C hello: Gỡ rối tên symbol C++ để dễ đọc hơn.

Ví dụ kết quả:

hello:0000000000001119 T main
hello:                 U printf

Bạn có thể kết hợp các tùy chọn này để tùy chỉnh kết quả đầu ra hơn nữa. Ví dụ:

nm -nC hello

Ví dụ kết quả:

hello:                 U std::ostream::operator<<(char const*)
hello:0000000000001119 T main

Lệnh này hiển thị các symbol được sắp xếp theo tên, với tên symbol C++ được gỡ rối để dễ đọc hơn.

Lệnh nm cung cấp rất nhiều thông tin về cấu trúc bên trong của các file thực thi, điều này có thể hữu ích cho các nhà phát triển, systemadmin và các nhà nghiên cứu bảo mật.

Lọc Thông tin Symbol Sử dụng nm Options

Trong bước này, chúng ta sẽ khám phá cách sử dụng lệnh nm để lọc thông tin symbol cho file thực thi hello.

Đôi khi, kết quả đầu ra của lệnh nm có thể quá tải, đặc biệt đối với các file thực thi lớn. Để tập trung vào các loại symbol cụ thể, chúng ta có thể sử dụng các tùy chọn nm sau:

  • nm -D hello: Chỉ hiển thị các symbol động (các symbol được sử dụng bởi trình liên kết động).
  • nm -T hello: Chỉ hiển thị các symbol tĩnh (toàn cục).
  • nm -t <format> hello: Hiển thị địa chỉ symbol ở một định dạng cụ thể (d cho số thập phân, x cho số thập lục phân, o cho số bát phân).
  • nm --defined-only hello: Chỉ hiển thị các symbol đã được định nghĩa (không phải các symbol bên ngoài/chưa được định nghĩa).
  • nm --undefined-only hello: Chỉ hiển thị các symbol chưa được định nghĩa.

Ví dụ: để hiển thị các symbol động ở định dạng thập lục phân:

nm -Dt hello

Ví dụ kết quả:

0000000000001119 T main
                 U printf

Để chỉ hiển thị các symbol tĩnh (toàn cục):

nm -T hello

Ví dụ kết quả:

0000000000001119 T main

Bạn có thể kết hợp các tùy chọn này để tinh chỉnh hơn nữa kết quả đầu ra. Ví dụ: để chỉ hiển thị các symbol đã được định nghĩa ở định dạng dễ đọc hơn:

nm --defined-only -nC hello

Ví dụ kết quả:

hello:0000000000001119 T main

Lọc thông tin symbol có thể đặc biệt hữu ích khi làm việc với các file thực thi lớn hoặc phức tạp, vì nó cho phép bạn tập trung vào các symbol cụ thể mà bạn quan tâm.

Tóm tắt

Trong lab này, chúng ta đã khám phá lệnh nm của Linux, được sử dụng để hiển thị thông tin symbol cho các file object. Đầu tiên, chúng ta đã tạo một chương trình C đơn giản và biên dịch nó thành một file thực thi, sau đó sử dụng lệnh nm để xem thông tin symbol của file thực thi. Chúng ta đã học được rằng lệnh nm cung cấp nhiều tùy chọn khác nhau để tùy chỉnh kết quả đầu ra và lọc thông tin symbol, chẳng hạn như hiển thị tên file, sắp xếp kết quả đầu ra theo tên symbol và hiển thị loại và giá trị symbol. Lab này cung cấp một sự hiểu biết thực tế về cách sử dụng lệnh nm để phân tích cấu trúc bên trong của các file thực thi.

400+ câu lệnh phổ biến trong Linux