在Linux上,调试符号是否被加载到内存中?

3
从可执行文件(或共享库)中删除调试符号是否会减少内存使用量?(我知道它可以减小磁盘文件的大小 - 我在这里感兴趣的是实际使用的RAM)。
Drepper在他的论文http://www.akkadia.org/drepper/dsohowto.pdf的第13页上说:
“正常的符号表在运行时不使用,因此没有必要将二进制文件去除它。”
另一方面,strip的man页面说:
“一个经过剥离的二进制文件将占用更少的RAM空间。”
根据一些快速测试,看起来Drepper是正确的(毫不意外),因此strip的man页面是错误的。
有人能帮助确认/否认吗?

在这两种情况下,我倾向于查看/proc/[pidno]/maps。 - Chris Stratton
@Chris Stratton:映射页面是按需加载的,因此“maps”只告诉您有关地址空间使用情况,而不是实际核心使用情况。 - caf
首先,如果它没有被映射,那么它不太可能占用 RAM。其次,我认为哪些文件部分可以加载是一个问题,其答案比哪些页面可以在任何给定时刻加载到实际物理内存中更具有确定性,因为这取决于执行它的系统的细节。 - Chris Stratton
但是,如果您想尝试凭经验决定在任何给定时刻实际驻留的内容,/proc/pid/smaps 应该能够胜任。 - Chris Stratton
1个回答

0
在使用预读取加速启动和程序启动的系统上,调试符号确实会浪费文件缓存中的内存。

ELF 加载器似乎可以在对应于调试符号的范围上使用 madvise(MADV_DONTNEED) - caf
@caf:无论如何,readahead仍会浪费时间读取数据。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接