簡體   English   中英

如何在Mac OS上使用“ nm”在C程序中顯示本地(非外部)符號?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM