c - 如何在 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");
}
解决方案
你没有找到它,因为它不存在 - 查看反汇编 ( 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 上得到类似的结果。
推荐阅读
- django - 如何从数组列表字段中过滤整数列表
- html - 如何使用本地文件 svg?
- azure-devops - Azure Devops YAML 管道中的条件依赖作业
- python - 我解析 Beautifulsoup 时没有文本
- python - 如何获取导入的python文件的绝对路径
- uwp - VS2017:构建 store 包时,bundle.upload 文件不会被创建
- excel - 条件格式问题 - Excel (AND,ISNUMBER,LARGE)
- python - 任何月份的 Pandas 中按周和国家/地区聚合
- react-native - 下拉触摸区域增加其不可正确触摸
- python - 输出的外部尺寸必须是未知的