2012-07-16 58 views
1

我的工作有以下規格運行的嵌入式項目:armv5tejl編譯問題字符數組

#UNAME -a

的Linux FFxAV 2.6.30.10#MVL-AVB-0.6星期四軍28十七時55分44秒EDT 2012 armv5tejl的GNU/Linux

#執行cat/proc內/ cpuinfo

處理器:ARM926EJ-S第5版(V5L)

BogoMIPS:159.74

特點:SWP半fastmult EDSP的Java

CPU實施者:0×41

CPU架構:5TE

CPU的變體:爲0x1

CPU部分:0x926

CPU修訂版:5

$在/ usr /本地/ ARM的2007年第三季度/斌/ ARM-NONE-Linux的gnueabi-GCC --version

臂無-Linux的gnueabi-GCC(CodeSourcery的的Sourcery G ++精簡版2007q3- 51)4.2.1


我編譯這個平臺上使用lldpd(0.6),並發現了一些新的和有趣的方式,使我的代碼段錯誤。

我遇到的問題與char數組的分配有關。

如果我以這種方式分配:

char * opts; opts =(char *)malloc(sizeof(char)* 50);

代碼正常工作(實際上在以後的調用中發生段錯誤,但我們不要停留)。

如果我不喜歡這樣但是分配:

炭OPTS [49];

代碼segfaults之前,我的任何調試甚至打印。這一切都發生在主要方法的頂部。

5 int main(int argc, char ** argv){ 
    6 
    7  fprintf(stderr, "%d\n", __LINE__); 
    8  char bopts [50] = "H:vhkrdxX:m:4:6:I:C:p:M:P:S:[email protected]     "; 
    9  bopts[10] = 'g'; 
10 } 

運行在一個很小的測試程序正常,但在lldpd

1034  char opts [51] = "H:vhkrdxX:m:4:6:I:C:p:M:P:S:[email protected]     "; 

段錯誤。ç

我說幹就幹,從分配每個拉集:

從簡單的測試程序(功能)

107  char bopts [50] = "H:vhkrdxX:m:4:6:I:C:p:M:P:S:[email protected]     "; 
108  8424: e59f3044 ldr r3, [pc, #68] ; 8470 <main+0x78> 
109  8428: e24b2036 sub r2, fp, #54 ; 0x36 
110  842c: e3a0c032 mov ip, #50 ; 0x32 
111  8430: e1a00002 mov r0, r2 
112  8434: e1a01003 mov r1, r3 
113  8438: e1a0200c mov r2, ip 
114  843c: ebffffba bl 832c <_init+0x44> 

從lldpd.c

5061  char opts [51] = "H:vhkrdxX:m:4:6:I:C:p:M:P:S:[email protected]     "; 
5062  d414: e59f3918 ldr r3, [pc, #2328] ; dd34 <lldpd_main+0x9d4> 
5063  d418: e51b20bc ldr r2, [fp, #-188] 
5064  d41c: e0823003 add r3, r2, r3 
5065  d420: e24b2043 sub r2, fp, #67 ; 0x43 
5066  d424: e3a0c033 mov ip, #51 ; 0x33 
5067  d428: e1a00002 mov r0, r2 
5068  d42c: e1a01003 mov r1, r3 
5069  d430: e1a0200c mov r2, ip 
5070  d434: ebfff229 bl 9ce0 <_init+0x344> 

到目前爲止我看不出這裏有什麼問題。

當在堆上分配數組而不是堆時,當試圖在堆棧上分配sockaddr_un結構時,程序seqfaults。

從un.h

8 struct sockaddr_un { 
9  __kernel_sa_family_t sun_family; /* AF_UNIX */ 
10  char sun_path[UNIX_PATH_MAX]; /* pathname */ 
11 }; 

我的假設是,這是同樣的堆疊陣列的問題,但我有麻煩搞清楚到底是什麼。

無論如何,意見或建議表示讚賞。這讓我瘋狂了幾天。

回答

0

看起來像編譯器在一個對齊的位置上將棧var對齊到(請參見sub r2, fp, #67指令)。這是非常奇怪的國際海事組織,但可能是段錯誤的解釋(雖然我不確定爲什麼任何代碼將使用字大小訪問字符數組)。如果您可以顯示崩潰和調用堆棧的確切位置,它可能會變得更清晰。

我認爲最簡單的解決方案是升級到更新的工具鏈(2007年較老),看看它是否更好。如果沒有,請嘗試確保所有本地變量的大小都對齊到4個字節。