2015-10-09 37 views
0
struct libimg 
{ 
    Elf32_Phdr ph; 
}; 

struct libimg limg = { 
    { 
     p_type: PT_LOAD, 
     p_memsz: 2 * PAGE_SIZE 
    } 
}; 

static void makelib(void *r) 
{ 
    limg.ph.p_vaddr = r; 
} 

而且Elf32_Phdrlinux/elf.h赋值时将指针整数,未作铸

typedef struct elf32_phdr{ 
    Elf32_Addr p_vaddr; 
    .... 
} Elf32_Phdr; 

定义我想分配从参数p_vaddr值。但是我得到这个警告assignment makes integer from pointer without a cast。我使用gdb来检查和print r显示(void *)0x08040000

+0

而你的问题是....? – Amit

+0

@Amit如何解决此警告?谢谢你的时间。 – HuangJie

+0

@黄杰哪条线正在产生错误? –

回答

1

编译器警告您赋值会导致隐式转换。它是这样做的,因为这可能是无意的,可能会产生不良影响。你可以纠正,通过在第一时间使用正确类型:

static void makelib(Elf32_Addr r) 
{ 
    limg.ph.p_vaddr = r; 
} 

这可能会导致其他行代码生成的警告,你应该用在这些地方铸造,例如:

makelib((Elf32_Addr)someVariable); 

这个想法是在你将一个值的含义从A类型改变为B类型的地方进行投射,在这里它是一个简洁的,深思熟虑的决定。如果你不能在第一时间使用正确的类型,也就是说,如果someVariable不能是Elf32_Addr,你只应该这样做(铸造)。

+0

通常我们用这种方式定义'p_vaddr':'p_vaddr:0x40017000'就像'struct'中的'p_type'和'p_memsz',但是现在它的值被设置为'1073836032 '。我们可以说他们是一样的吗? – HuangJie

+0

@黄杰打开你的计算器,并把十六进制值,并将其转换为十进制。你会发现这是相同的价值。 – LPs

+0

@LPs谢谢你的回复。是的,我明白了。 – HuangJie

0

Linux/arch/powerpc/boot/elf.h

94 typedef struct elf32_phdr { 
95   Elf32_Word p_type; 
96   Elf32_Off p_offset; 
97   Elf32_Addr p_vaddr; 
98   Elf32_Addr p_paddr; 
99   Elf32_Word p_filesz; 
100   Elf32_Word p_memsz; 
101   Elf32_Word p_flags; 
102   Elf32_Word p_align; 
103 } Elf32_Phdr; 

Elf32_Addr

typedef unsigned int Elf32_Addr; 

最后,你作为unsigned int或更好的分配void *unsigned int

投它以Elf32_Addr来避免warni ng:

limg.ph.p_vaddr = (Elf32_Addr)r; 
+0

否@Amit我已经发布'Elf32_Phdr'类型,或者将其转换为'Elf32_Addr',或接受作为输入第一名。 – Amit

+0

为什么不直接使用'Elf32_Addr' ....'limg.ph.p_vaddr =(Elf32_Addr)r'; – HuangJie

+0

@黄杰见我的答案为什么... – Amit

相关问题