linux中“size”命令的结果和text& edata& end的值不同

时间:2013-05-02 01:46:59

标签: c linux process

代码是

/* test_etext.c */

#include <unistd.h>
#include <stdio.h>

extern char etext, edata, end;

int
main(int argc, char *argv[])
{
    pid_t pid, ppid;

    pid = getpid();
    ppid = getppid();

    printf("%ld\t%ld\t%ld\n", &etext, &edata-&etext, &end-&edata);

    return 0;
}

然后像这样编译并运行它

gcc -o test_etext test_etext.c

./test_etext
4196125 2099507 8

size ./test_etext
text       data     bss     dec     hex filename
1532        592       8    2132     854 ./test_etext

问题是为什么“&amp; edata-&amp; etext”和“data”之间的细分数据不同?

1 个答案:

答案 0 :(得分:1)

当然他们是不同的!您是否阅读了联机帮助页man 3 etext

  • etext是文本末尾的第一个地址(代码),
  • edata是初始化数据末尾的第一个地址,
  • end是未初始化数据(bss)结束后的第一个地址

由于地址空间随机化,您不应该假设内存中的上述布局。因此,他们的差异没有传达可靠的信息

要计算文本,初始化数据和未初始化数据的相应大小,您需要先查找相同的初始地址(并从相应的结束地址中减去)。

由于您标记了Linux的问题,我个人只是通过阅读/proc/self/statm伪文件来查询内核的意见。如果您需要更详细的信息(如动态加载库的详细信息)或与size命令输出匹配的信息,请阅读/proc/self/smaps/proc/self/maps伪文件。这些都在man 5 proc中详细描述。

对于可执行的ELF文件 - 例如,与sizeobjdump的工作方式类似 - ,至少使用现有的实用程序或现有的库。