我的工作有以下規格運行的嵌入式項目: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 };
我的假設是,這是同樣的堆疊陣列的問題,但我有麻煩搞清楚到底是什麼。
無論如何,意見或建議表示讚賞。這讓我瘋狂了幾天。