Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “的结果;“尺寸”;linux中的命令和text&;edata&;目的不同_C_Linux_Process - Fatal编程技术网

C “的结果;“尺寸”;linux中的命令和text&;edata&;目的不同

C “的结果;“尺寸”;linux中的命令和text&;edata&;目的不同,c,linux,process,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,

代码是

/* 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;
}

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

当然它们是不同的!你看过手册了吗

  • etext
    是文本(code)结尾后的第一个地址
  • edata
    是经过初始化数据末尾的第一个地址,并且
  • end
    是超过未初始化数据(bss)末尾的第一个地址
由于地址空间随机化,您不应该假设内存中上述内容的布局。因此,它们之间的差异无法传递可靠的信息

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

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


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

当然它们是不同的!你看过手册了吗

  • etext
    是文本(code)结尾后的第一个地址
  • edata
    是经过初始化数据末尾的第一个地址,并且
  • end
    是超过未初始化数据(bss)末尾的第一个地址
由于地址空间随机化,您不应该假设内存中上述内容的布局。因此,它们之间的差异无法传递可靠的信息

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

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

对于可执行ELF文件——例如,类似于
size
objdump
的工作方式——请使用现有的实用程序,或者至少使用现有的库。

谢谢,“过去”一词让我感到困惑。我认为文本段和etext的结尾位置是连续的。谢谢,过去这个词让我感到困惑。我认为文本段末尾和etext的位置是连续的。
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