我在谈论的是英特尔32位平台。Linux内核版本为2.6.31-14。
#include <stdio.h>
#include <stdlib.h>
int init_global_var = 10; /* Initialized global variable */
int global_var; /* Uninitialized global variable */
static int init_static_var = 20; /* Initialized static variable in global scope */
static int static_var; /* Uninitialized static variable in global scope */
int main(int argc, char **argv, char **envp)
{
static int init_static_local_var = 30; /* Initialized static local variable */
static int static_local_var; /* Uninitialized static local variable */
int init_local_var = 40; /* Initialized local variable */
int local_var; /* Uninitialized local variable */
char *dynamic_var = (char*)malloc(100); /* Dynamic variable */
printf("Address of initialized global variable: %p\n", &init_global_var);
printf("Address of uninitialized global variable: %p\n", &global_var);
printf("Address of initialized static variable in global scope: %p\n", &init_static_var);
printf("Address of uninitialized static variable in global scope: %p\n", &static_var);
printf("Address of initialized static variable in local scope: %p\n", &init_static_local_var);
printf("Address of uninitialized static variable in local scope: %p\n", &static_local_var);
printf("Address of initialized local variable: %p\n", &init_local_var);
printf("Address of uninitialized local variable: %p\n", &local_var);
printf("Address of function (code): %p\n", &main);
printf("Address of dynamic variable: %p\n", dynamic_var);
printf("Address of environment variable: %p\n", &envp[0]);
char* p=0x0;
printf("%s\n",p);
exit(0);
}
输出:
naman@naman-laptop ~> ./a.out
Address of initialized global variable: 0x804a020
Address of uninitialized global variable: 0x804a03c
Address of initialized static variable in global scope: 0x804a024
Address of uninitialized static variable in global scope: 0x804a034
Address of initialized static variable in local scope: 0x804a028
Address of uninitialized static variable in local scope: 0x804a038
Address of initialized local variable: 0xbfc11cbc
Address of uninitialized local variable: 0xbfc11cb8
Address of function (code): 0x8048484
Address of dynamic variable: 0x8223008
Address of environment variable: 0xbfc11d7c
fish: Job 1, “./a.out” terminated by signal SIGSEGV (Address boundary error)
在上述代码中,我有以下疑惑。为什么代码位于
0x8048484
而不是靠近虚拟内存的起始位置,例如0x00000400
?据我所知,布局应该如下:
低内存........................................高内存
Text Data BSS Heap.....................Stack Env
所以,文本不应该存储在内存的下方。它应该靠近较低的内存,不是吗?
file FILENAME
,例如file a.out
。您将看到您有一个 ELF 文件。 "a.out" 名称是默认可执行文件名称的历史名称。a.out 文件格式现在已不再使用。链接器脚本特定于文件格式,但 COFF/A.OUT 脚本可能具有类似的加载地址。这是 ABI、静态链接器 (ld
) 和(部分)动态链接器 (ld-linux.so
) 的属性。 - osgx