C ++中的符号 - 是否以非导出方式导出

C ++破坏了符号名称。 这些名称可以在调试时使用 - 但只有在二进制文件未被删除的情况下才能使用。 其他使用场景是共享库 - 符号名称可以导出并在库中可见。

但是在两个方面:

一个。 剥离构建,

湾 和普通的非共享库构建

二进制文件中应该没有可用的符号? 例如,字符串工具不会输出任何符号?


一个。 剥离构建

湾 非共享库构建

目前尚不清楚您是否在寻求一种能够同时满足A)和B),或者A)和B)情景的构建。

对于两个 - 非共享的,剥离的构建 - 是的,符号应该都没有了。

对于A),否:如果您使用共享库,则符号将(默认情况下)从其导出,并且strip不会将其移除。 如果您正在使用ELF ,则可以使用__attribute__((visibility("hidden")))或等效机制来限制符号可见性。

对于B) - 非剥离,非共享构建,符号通常会出现在符号表中,因此strings将显示它们。 为了摆脱它们,使用strip (将其变成A)和B)组合)。


strip命令从图像中删除调试符号。 在共享对象中导出的符号不是调试符号,并且不会被strip删除。 这些符号可用于定位函数/数据,但它们不会将代码与源相关联。


在不是共享库的剥离版本(a)中,没有符号可用。

在“正常”构建中(既不调试也不剥除)(b),函数名称的符号被保留,但所有其他调试符号都不被保留。 在调试器中,您将能够捕获带有函数名称的堆栈跟踪,但不会检查其参数或打印堆栈变量的值。

链接地址: http://www.djcxy.com/p/53299.html

上一篇: Symbols in C++ – are they exported in non

下一篇: GNU ld does not handle ORIGIN processing correctly; is there a workaround?