1

从对象文件生成共享对象时是否有可能保留调试符号?

例如,我使用 cc 使用隐式目标生成带有调试符号的目标文件,并且只将 -g 添加到 CFLAGS。然后,我通过定义一个自定义目标来生成共享对象 (.so) 文件,在该目标中我使用 cc 的 -shared 选项。

到目前为止,我的观察是:

  • 当直接从源代码文件生成共享对象时,我确实得到了调试符号
  • 从包含调试符号的对象文件生成共享对象时使用 -g 选项无济于事

我的假设是:

  • 调试符号确实不包括在内,因为在创建 rpm 时,/usr/lib/rpm/find-debuginfo.sh 会自动运行,并且我收到一些警告说我的文件已经被剥离

如果需要确切的文件进行检查,例如如何生成 radius.so:http://git.ozlabs.org/?p=ppp.git;a=blob;f=pppd/plugins/radius/Makefile 。 linux;h=24ed3e580c4db6aeca129dd22dbe6de5f2d1ff5f;hb=HEAD

我需要再次提及,我已向 CFLAGS 添加了 -g 选项。

谢谢!

4

1 回答 1

2

快速而简单的答案是在 %install 脚本的末尾添加 exit 0 ,这会禁用在运行时附加到 %install build scriptlet 末尾的各种帮助程序。

更具体的答案是在您的系统上使用 rpm --showrc 检查帮助程序脚本(去除调试符号的共享库)并修改正在运行的帮助程序。

需要配置为禁用调试符号剥离的两个最重要的宏是:

# Define per-arch and per-os defaults. Normally overridden by per-target macros.
%__arch_install_post    %{nil}
%__os_install_post      %{___build_post}

通常在 redhat-rpm-config 包中重新定义。

于 2014-09-22T04:30:54.197 回答