Nếu bạn là người dùng Linux cũng tham gia vào mã hóa và phát triển phần mềm cấp hệ thống, bạn có thể thấy mình trong những tình huống cần thông tin liên quan đến ký hiệu trong tệp đối tượng. Bạn sẽ vui mừng khi biết rằng có một tiện ích dòng lệnh - được gọi là nm - mà bạn có thể sử dụng trong những tình huống này.
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 công cụ này bằng một số ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần lưu ý rằng tất cả các ví dụ ở đây đều đã được thử nghiệm trên máy Ubuntu 22.04 LTS.
Sau đây là cách trang hướng dẫn của lệnh giải thích về 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 nm hoạt động.
Ảnh chụp màn hình sau đây cho thấy loại đầu ra mà lệnh trên tạo ra:
Ba cột được tạo ra trong đầu ra lần lượt biểu diễn giá trị ký hiệu, loại ký hiệu và tên ký hiệu. Có một số loại ký hiệu - để biết thông tin chi tiết đầy đủ, hãy truy cập trang hướng dẫn lệnh nm.
Ví dụ:
Vì vậy, bạn có thể thấy tên tệp đã được thêm vào đầu mỗi dòng.
Ví dụ:
Lệnh trên sẽ hiển thị tất cả các ký hiệu, bao gồm các ký hiệu chỉ dành cho trình gỡ lỗi mà thông thường không được liệt kê.
Ví dụ:
Đây là những gì trang hướng dẫn nói về tùy chọn này:
Ví dụ:
Vì vậy, bạn có thể thấy rằng nm chỉ tạo ra các ký hiệu động trong đầu ra.
Ví dụ:
Quan sát sự thay đổi trong định dạng ngay bây giờ.
Ví dụ:
Ví dụ:
Vì vậy, bạn có thể thấy đầu ra được sắp xếp theo địa chỉ hiện tại.
Trong trường hợp bạn không muốn nm áp dụng bất kỳ loại sắp xếp nào (bao gồm cả loại mặc định mà nó sử dụng), hãy sử dụng tùy chọn dòng lệnh -p. Tiếp theo, để đảo ngược bất kỳ loại sắp xếp nào hiện có, hãy sử dụng tùy chọn dòng lệnh -r.
Ví dụ:
Ví dụ:
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 công cụ này bằng một số ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần lưu ý rằng tất cả các ví dụ ở đây đều đã được thử nghiệm trên máy Ubuntu 22.04 LTS.
Lệnh nm của Linux
Tiện ích dòng lệnh nm về cơ bản liệt kê các ký hiệu từ các tệp đối tượng. Đây là cú pháp của công cụ:
Mã:
nm [OPTIONS] OBJECT-FILENAME
Mã:
GNU nm liệt kê các ký hiệu từ các tệp đối tượng objfile.... Nếu không có tệp đối tượng
nào được liệt kê làm đối số, nm sẽ coi tệp a.out.
Câu hỏi 1. Lệnh nm hoạt động như thế nào?
Cách sử dụng cơ bản của lệnh này rất đơn giản - tất cả những gì bạn phải làm là chạy lệnh 'nm' và truyền tên của tệp đối tượng làm đầu vào cho lệnh đó. Ví dụ, tôi đã sử dụng lệnh nm với tệp nhị phân 'apl':
Mã:
nm apl
Ba cột được tạo ra trong đầu ra lần lượt biểu diễn giá trị ký hiệu, loại ký hiệu và tên ký hiệu. Có một số loại ký hiệu - để biết thông tin chi tiết đầy đủ, hãy truy cập trang hướng dẫn lệnh nm.
Câu 2. Làm thế nào để có tên tệp đứng trước mỗi ký hiệu trong đầu ra?
Bạn có thể thực hiện việc này bằng tùy chọn dòng lệnh -A.
Mã:
nm -A [obj-file]
Mã:
nm -A apl
Vì vậy, bạn có thể thấy tên tệp đã được thêm vào đầu mỗi dòng.
Câu hỏi 3. Làm thế nào để nm cũng hiển thị các ký hiệu gỡ lỗi?
Để làm cho nm cũng hiển thị các ký hiệu gỡ lỗi trong đầu ra, hãy sử dụng tùy chọn dòng lệnh -a.
Mã:
nm -a [obj-filename]
Mã:
nm -a apl
Câu hỏi 4. Làm thế nào để nm giải mã các tên ký hiệu cấp thấp?
Nếu muốn, bạn thậm chí có thể buộc nm giải mã các tên ký hiệu cấp thấp thành các tên cấp người dùng. Bạn có thể thực hiện việc này bằng tùy chọn dòng lệnh -C.
Mã:
nm -C [obj-file]
Mã:
nm -C apl
Mã:
Bên cạnh việc xóa bất kỳ dấu gạch dưới ban đầu nào được hệ thống thêm vào,
điều này giúp tên hàm C++ dễ đọc. Các trình biên dịch khác nhau có
các kiểu sắp xếp khác nhau. Đối số kiểu sắp xếp tùy chọn
có thể được sử dụng để chọn kiểu sắp xếp phù hợp cho trình biên dịch
của bạn.
Câu hỏi 5. Làm thế nào để nm chỉ hiển thị các ký hiệu động?
Trong trường hợp bạn muốn nm chỉ hiển thị các ký hiệu động, thay vì các ký hiệu thông thường, hãy sử dụng tùy chọn dòng lệnh -D.
Mã:
nm -D [obj-file]
Mã:
nm -D apl
Vì vậy, bạn có thể thấy rằng nm chỉ tạo ra các ký hiệu động trong đầu ra.
Câu hỏi 6. Làm thế nào để sử dụng các định dạng đầu ra khác nhau của nm?
Để bật các định dạng đầu ra khác nhau, hãy sử dụng tùy chọn dòng lệnh -f. Theo mặc định, đầu ra được tạo ở định dạng bsd, tuy nhiên, nếu muốn, bạn cũng có thể bật định dạng 'sysv' và 'posix'.
Mã:
nm -f [format] [obj-filename]
Mã:
nm -f posix apl
Quan sát sự thay đổi trong định dạng ngay bây giờ.
Câu 7. Làm thế nào để nm chỉ hiển thị các ký hiệu bên ngoài?
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 -g.
Mã:
nm -g [obj-file]
Mã:
nm -g apl
Câu hỏi 8. Tất cả các tùy chọn sắp xếp mà nm cung cấp là gì?
Theo mặc định, các ký hiệu được sắp xếp theo thứ tự bảng chữ cái. Tuy nhiên, nếu muốn, bạn có thể sắp xếp chúng theo thứ tự số theo địa chỉ của chúng bằng cách sử dụng tùy chọn dòng lệnh -n.
Mã:
nm -n [objfile]
Mã:
nm -n apl
Vì vậy, bạn có thể thấy đầu ra được sắp xếp theo địa chỉ hiện tại.
Trong trường hợp bạn không muốn nm áp dụng bất kỳ loại sắp xếp nào (bao gồm cả loại mặc định mà nó sử dụng), hãy sử dụng tùy chọn dòng lệnh -p. Tiếp theo, để đảo ngược bất kỳ loại sắp xếp nào hiện có, hãy sử dụng tùy chọn dòng lệnh -r.
Câu 9. Làm thế nào để nm chỉ hiển thị các ký hiệu chưa xác định?
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 -u.
Mã:
nm -u [tệp obj]
Mã:
nm -u apl
Câu 10. Làm thế nào để chỉ hiển thị các ký hiệu được xác định của nm?
Để chỉ hiển thị các ký hiệu được xác định của nm, hãy sử dụng tùy chọn dòng lệnh --defined-only.
Mã:
nm --defined-only [tệp obj]
Mã:
nm --defined-only apl