到底是&_text表示地址还是_text表示地址
在linux-3.7.4的版本中,文件init_32.c (arch\x86\mm)中的函数is_kernel_text()定义如下:
static inline int is_kernel_text(unsigned long addr)
{
if (addr >= (unsigned long)_text && addr <= (unsigned long)__init_end)
return 1;
return 0;
}
此时没有使用&符号表示地址。
而在同一文件中的函数mem_init()中有下面的用法:
codesize =(unsigned long) &_etext - (unsigned long) &_text;
datasize =(unsigned long) &_edata - (unsigned long) &_etext;
initsize =(unsigned long) &__init_end - (unsigned long) &__init_begin;
此时使用了&符号表示地址。
那么到底是&_text表示地址还是_text表示地址。
把两个值打出来岂不是很明了 是否是二级指针 ? 在应用程序下测试了一下,如果写成:
extern int _edata;
那么_edata是无效的,而&_edata表示地址;
如果写成:
extern char _edata[];
那么edata和&_edata都表示表示地址,与函数名类似。
原理是什么? 回复 4# yang511yang
int a[],
那么a=&a。 _edata 只是定义在lds中一个symbol
在C语言里你可以把这个symbol表达为一个任何类型的变量,甚至是函数名
如果解释为一个extern char _edata[];
那么对 _edata 取值 就是 该数组的内存地址
对 &_data 取值, 语法也解释为该数组的内存地址
但是你把解释为extern int _edata,
那么对于int变量而言, _edata 和 &_data 就有区别了
(gdb) p /x _edata
$3 = 0x0
(gdb) p /x &_edata
$4 = 0x804a014
(gdb) p /x *((int *)0x804a014)
$5 = 0x0 谢谢各位,理解了!
页:
[1]