贵阳花果园网站建设,网站建设网站及上传,wordpress rss 全文,制作小程序的步骤如何查看符号表
要查看.a文件的内容#xff0c;可以使用ar命令。下面是一些常见的用法#xff1a;
列出.a文件中包含的所有文件#xff1a;
ar t filename.a提取.a文件中的单个文件#xff1a;
ar x filename.a filename.o将.a文件中的所有文件提…如何查看符号表
要查看.a文件的内容可以使用ar命令。下面是一些常见的用法
列出.a文件中包含的所有文件
ar t filename.a提取.a文件中的单个文件
ar x filename.a filename.o将.a文件中的所有文件提取到当前目录
ar x filename.a在.a文件中添加新文件
ar r filename.a filename.o替换.a文件中的现有文件
ar r filename.a filename.o请注意.a文件通常是静态库文件包含编译后的目标文件。如果您想查看目标文件的内容可以使用objdump或readelf等工具
要查看.so文件的内容你可以使用以下命令
列出.so文件中包含的符号表
nm -D filename.so列出.so文件中包含的所有函数和变量
objdump -T filename.so查看.so文件中某个函数的汇编代码
objdump -d -M intel filename.so | grep function_name查看.so文件的头部信息
readelf -h filename.so请注意.so文件通常是共享库文件包含已编译的可重定位目标文件。这些命令将允许查看.so文件中的各种元素例如符号表、函数、变量和汇编代码。 nm是Symbol table Namer的缩写。nm命令可以列出目标文件中定义和引用的符号并且可以根据不同的选项以不同的格式显示这些符号信息。在Linux系统上nm命令通常与C/C编译器一起使用用于查看编译后的二进制文件例如可执行文件、静态库文件、共享库文件中的符号表信息。 C中使用gcc编译的C模块
https://zhuanlan.zhihu.com/p/114669161 有一个用gcc编译出来的util.o
// util.h
int add(int, int);// util.c
int add(int a, int b)
{return a b;
}在C中如果想使用这个.o就必须让g编译器以gcc的方式生成符号表才能在用gcc编译的.o中找到对应的符号在util.h中用extern C’声明一下那么包含了这个.h的.cpp文件编译时就知道用gcc的方式去生成add的符号表
// util.h
extern C
{int add(int, int);
}通常情况下如果一个模块使用gcc编译成的动/静态库给别人用的话这个模块的.h文件一般这么写
#ifdef __cplusplus
extern C {
#endifint add(int, int);#ifdef __cplusplus
}
#endif在C中用C的模块
https://zhuanlan.zhihu.com/p/361485807 有一个C风格写的代码 test.h和test.cpp因为C无法直接调用Cpp风格的代码所以增加一个接口模块这个接口代码中调用test.cpp的功能然后让这个接口模块以C的风格编译。
// test.h
class Test {
public:int add(int, int);
}// test.cpp#include test.h
int Test::add(int, int) { ... }// test_api.cpp
#include robot.h#ifdef __cplusplus
extern C {
#endif// 因为我们将使用C的编译方式用g编译器来编译 test_api.cpp 这个文件
// 所以在这个文件中我们可以用C代码去定义函数 void test_api(int a, int b)在函数中使用C的类 Test
// 最后我们用 extern C 来告诉g编译器不要对 test_api(int a, int b) 函数进行name mangling
// 这样最终生成的动态链接库中函数 test_api(int a, int b) 将生成 C 编译器的符号表示。void test_api(int a, int b)
{Test t;t.add(a, b);
}#ifdef __cplusplus
}
#endif