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_Phdr
linux/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 :(得分:1)
编译器警告您分配导致隐式转换。这样做是因为这可能是无意的,并且可能会产生不良影响。你可以通过首先使用正确的类型来解决这个问题:
static void makelib(Elf32_Addr r)
{
limg.ph.p_vaddr = r;
}
这可能导致其他代码行生成警告,您应该在这些地方使用强制转换,例如:
makelib((Elf32_Addr)someVariable);
这个想法是在你将一个值的含义从A类改为B类的地方,这是一个简洁,慎重的决定。如果您不能在第一时间使用正确的类型,即someVariable
不能Elf32_Addr
,那么您应该这样做(强制转换)。
答案 1 :(得分: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;
最后,您要将void *
分配给unsigned int
将其unsigned int
或更好地投放到Elf32_Addr
以避免警告:
limg.ph.p_vaddr = (Elf32_Addr)r;