2015-10-09 64 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

相關問題