gpt4 book ai didi

c - 如何在 macOS 上使用 `nm` 在 C 程序中显示本地(非外部)符号?

转载 作者:太空宇宙 更新时间:2023-11-04 06:45:58 25 4
gpt4 key购买 nike

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

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

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

但是,对于下面的 ma​​in.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 列出所有符号(包括本地符号)?

ma​​in.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 上得到类似的结果。

关于c - 如何在 macOS 上使用 `nm` 在 C 程序中显示本地(非外部)符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com