[英]How to display local (non-external) symbols in a C-program using `nm` on macOS?
我想在macOS上使用nm
在C程序中顯示本地(非外部)符號。
我讀過man nm
,它實際上為我提供了以下顯示符號信息的選項:
nm -m (Mach-O symbols)
nm -g (external symbols)
nm -a (all symbols)
但是,對於下面的main.c程序,我希望nm -a
也輸出foo
,因為它通過使用static
關鍵字定義為本地符號(內部鏈接):
nm -a main
0000000100000000 T __mh_execute_header
0000000100000f60 T _bar
0000000100000f30 T _main
U _printf
U dyld_stub_binder
但是, foo
沒有在符號中列出。 如何使nm
列出所有符號(包括本地符號)?
main.c (編譯為clang main.c -o main
):
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("main");
}
static void foo() {
printf("foo");
}
extern void bar() {
printf("baz");
}
您找不到它是因為它不存在-查看反匯編( objdump -d
)。
編譯器通常會消除未使用的靜態函數,即使是在-O0時。 為了保留foo函數,您可以嘗試使其同時使用和使用(因此不會被內聯)。
例如,用於:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("main");
}
static void foo() {
for(int i=0;i<100;i++)
printf("foo");
}
extern void bar() {
printf("baz");
foo();
}
我得到:
0000000000000000 T bar
0000000000000000 t foo
0000000000000000 T main
U printf
在Linux上使用clang。 您應該在MacOS上得到類似的結果。
要加上@PSkocik的出色答案,您可以確保使用以下命令在最終的二進制文件中發出該函數:
static void foo() __attribute__((used));
static void foo() {
printf("foo");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.