yang511yang 发表于 2014-05-16 09:29

到底是&_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表示地址。

amarant 发表于 2014-05-16 10:01

把两个值打出来岂不是很明了

qxhgd 发表于 2014-05-16 10:08

是否是二级指针 ?

yang511yang 发表于 2014-05-16 10:19

在应用程序下测试了一下,如果写成:
extern int _edata;
那么_edata是无效的,而&_edata表示地址;

如果写成:
extern char _edata[];
那么edata和&_edata都表示表示地址,与函数名类似。
原理是什么?

qxhgd 发表于 2014-05-16 10:39

回复 4# yang511yang


    int a[],
那么a=&a。

senioryzc 发表于 2014-05-16 11:12

_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

yang511yang 发表于 2014-05-16 13:24

谢谢各位,理解了!
页: [1]
查看完整版本: 到底是&_text表示地址还是_text表示地址