C++符号导出问题

导出符号

在Windows下生成DLL时,可以使用dll_export来将需要对外的符号导出来。

#define DLLEXPORT __declspec(dllexport)

在Linux中,默认是所有的符号都是导出的,只有使用了相应的attribute才能将不想导出的(库内部使用的)的符号隐藏起来。

#define DLLEXPORT __attribute__((visibility("default")))

DLLEXPORT是一个宏定义,通常用于C/C++语言中的动态链接库(DLL)的开发。
DLLEXPORT的作用是在编译动态库时,将函数或变量标记为可导出,以便其他程序可以调用这些函数或变量。
在Windows操作系统中,动态链接库是常用的组件化开发方式,它可以被多个程序共享,从而减少系统资源的浪费。使用DLLEXPORT可以将函数或变量标记为可导出,以便其他程序调用它们。

查看.SO导出符号

nm

nm(names) 是 GNU Binutils 二进制工具集的一员,用于显示目标文件中的符号。

命令格式

nm [-A|-o|--print-file-name] [-a|--debug-syms]
   [-B|--format=bsd] [-C|--demangle[=style]]
   [-D|--dynamic] [-f<format>|--format=<format>]
   [-g|--extern-only] [-h|--help]
   [-l|--line-numbers] [-n|-v|--numeric-sort]
   [-P|--portability] [-p|--no-sort]
   [-r|--reverse-sort] [-S|--print-size]
   [-s|--print-armap] [-t <radix>|--radix=<radix>]
   [-u|--undefined-only] [-V|--version]
   [-X 32_64] [--defined-only] [--no-demangle]
   [--plugin <name>] [--size-sort] [--special-syms]
   [--synthetic] [--target=bfdname]
   [objfile...]

常用选项说明

-A 在每个符号信息的前面打印所在对象文件名称;
-C 输出demangle过了的符号名称;具有很好可读性很好用
-D 打印动态符号;
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号。

说明
-C 适用于c++编译出来的对象文件。
为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。

示例

nm -A xxxx.so
nm -C xxxx.so
nm -D xxxx.so

objdump

objdump 用于查看目标文件(object file)或可执行文件的内容。它可以显示二进制文件的各种信息,如符号表、代码段、数据段、指令等。
命令格式

objdump [options] <file(s)>
objdump -t xxxx.so
objdump -T xxxx.so

导出的符号类型:

**Address(地址):**符号的地址。它指示符号在内存中的位置。
**Type(类型):**符号的类型。
以下是一些常见的类型值及其含义:

  • U:未定义符号,表示该符号在当前目标文件或共享目标库中未定义,但可能在其他目标文件或库中定义。
  • A:绝对符号,表示该符号的地址是绝对的,不会受到重定位的影响。
  • T:文本段符号,表示该符号是一个函数或可执行代码。
  • B:BSS段符号,表示该符号是一个未初始化的全局变量或静态变量。
  • D:数据段符号,表示该符号是一个已初始化的全局变量或静态变量。
  • R:只读数据段符号,表示该符号是一个只读数据,如常量字符串。
  • W:弱符号,表示该符号是一个可以被覆盖的弱引用。
  • V:弱对象符号,表示该符号是一个弱对象文件。
  • N:局部非文件符号,表示该符号是一个局部非文件符号。
  • G:全局非文件符号,表示该符号是一个全局非文件符号。
  • C:构造函数函数名标志,表示该符号是一个C++构造函数。
  • D:析构函数函数名标志,表示该符号是一个C++析构函数。
  • S:函数模板标志,表示该符号是一个函数模板。
  • I:成员函数标志,表示该符号是一个类的成员函数。
  • i:成员函数定义标志,表示该符号是一个类的成员函数定义。

**Size(大小):**符号的大小,以字节为单位。对于函数符号,它表示函数的代码大小。对于变量符号,它表示变量的大小。

**Object File(对象文件):**包含该符号定义的对象文件名。

**Symbol Name(符号名称):**符号的名称。

你可能感兴趣的:(C++,c++)