首页 > 解决方案 > 如何在 macOS 上使用“nm”在 C 程序中显示本地(非外部)符号?

问题描述

nm我想在 macOS 上使用的 C 程序中显示本地(非外部)符号。

我已经阅读了man nm,它基本上为我提供了以下用于显示符号信息的选项:

nm -m (Mach-O symbols)
nm -g (external symbols)
nm -a (all symbols) 

但是,对于下面的main.c程序,我希望nm -a也可以 output ,因为它通过使用关键字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");
}

标签: cmacosx86symbolsnm

解决方案


你没有找到它,因为它不存在 - 查看反汇编 ( 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 上得到类似的结果。


推荐阅读