如何解决使用pthread和arm-linux-gnueabihf-gcc的分段错误
我整天都在尝试解决仅在一台设备上出现的分段错误。但是从一开始...
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"
void* start_rtn(void* param);
int main(int argc,char **argv)
{
printf("Hallo World\n");
pthread_t tid;
int err = pthread_create(&tid,NULL,start_rtn,NULL);
pthread_join(tid,NULL);
printf("Exit\n");
}
void* start_rtn(void* param)
{
printf("Thread test\n");
}
这是我的CMakeList.txt的相关部分:
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
file(GLOB SOURCES "main.c")
add_executable(test ${SOURCES})
target_link_libraries(test -pthread)
此测试应用程序可在除一个设备上的所有ARM设备上运行。一台ARM设备立即发出分段错误。当我运行gdb时,将显示以下输出:
warning: core file may not match specified executable file.
[New LWP 10825]
warning: File "/lib/libthread_db-1.0.so" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
warning: Unable to find libthread_db matching inferior's thread library,thread debugging will not be available.
warning: File "/lib/libthread_db-1.0.so" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
warning: Unable to find libthread_db matching inferior's thread library,thread debugging will not be available.
Core was generated by `./test'.
Program terminated with signal 11,Segmentation fault.
#0 0x00000000 in ?? ()
但是...如果我在Raspberry Pi上编译相同的应用程序,则即使在特殊设备上也可以使用。
如果我删除对pthread_create
的调用,则无论它在哪个设备上编译,它都可以正常工作。
因此,我的交叉编译器似乎存在问题,但这仅在特定设备上并且仅在使用pthread方法时才明显。
我很无助,也很感谢每一个提示
这是没有工作的可执行文件的编号:
libpthread.so.0 => /lib/libpthread.so.0 (0xb6f2e000)
libc.so.6 => /lib/libc.so.6 (0xb6e02000)
ld-linux-armhf.so.3 => /lib/ld-linux-armhf.so.3 (0xb6dda000)
/lib/ld-linux-armhf.so.3 (0xb6f4d000)
Version information:
./testapp:
libpthread.so.0 (GLIBC_2.4) => /lib/libpthread.so.0
ld-linux-armhf.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libpthread.so.0:
ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
这是工作可执行文件(由raspberry pi编译)中的ldd输出
libpthread.so.0 => /lib/libpthread.so.0 (0xb6ee1000)
libc.so.6 => /lib/libc.so.6 (0xb6db5000)
/lib/ld-linux-armhf.so.3 (0xb6f00000)
Version information:
./testapp_working:
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
libpthread.so.0 (GLIBC_2.4) => /lib/libpthread.so.0
/lib/libpthread.so.0:
ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
附言:This thread似乎非常平等。我已经确保我的环境和Raspberry-Pi的所有gcc参数都相同。
编辑-Erlkoenig请求的编译器命令:
/usr/bin/arm-linux-gnueabihf-gcc -marm -march=armv6 -mfpu=vfp -mtp=soft -pthread -g2 -gdwarf-2 -DDEBUG -D LINUX -D _GNU_SOURCE -D _DEBUG -std=gnu11 -o CMakeFiles/testapp.dir/main.c.o -c main.c
/usr/bin/arm-linux-gnueabihf-gcc -marm -march=armv6 -mfpu=vfp -mtp=soft -pthread -g2 -gdwarf-2 -DDEBUG CMakeFiles/testapp.dir/main.c.o -o ARM/Debug/testapp -pthread
编辑-Erlkoenig请求的其他gdb输出:
Core was generated by `./testapp'.
Program terminated with signal 11,Segmentation fault.
#0 0x00000000 in ?? ()
(gdb) disas
No function contains program counter for selected frame.
(gdb) bt
#0 0x00000000 in ?? ()
#1 0xb6ecb5b0 in __pthread_initialize_minimal () from /lib/libpthread.so.0
#2 0xb6ec9ba0 in ?? () from /lib/libpthread.so.0
Cannot access memory at address 0x0
#3 0xb6ec9ba0 in ?? () from /lib/libpthread.so.0
Cannot access memory at address 0x0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) info reg
r0 0xb6f08504 3069216004
r1 0xb6ee41e0 3069067744
r2 0x800fff 8392703
r3 0x0 0
r4 0xb6f08504 3069216004
r5 0xb6ee2000 3069059072
r6 0xb6d99050 3067711568
r7 0xaf 175
r8 0x0 0
r9 0xb6ee4198 3069067672
r10 0xb6ecb2e0 3068965600
r11 0x0 0
r12 0xb6e979e0 3068754400
sp 0xbe9bec30 0xbe9bec30
lr 0xb6ecb5b0 -1226000976
pc 0x0 0x0
cpsr 0x60000010 1610612752
(gdb) info thread
Id Target Id Frame
* 1 LWP 24127 0x00000000 in ?? ()
(gdb)
编辑-查看Erlkoenig请求的CPU信息:
processor : 0
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 1594.16
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc09
CPU revision : 0
Hardware : Altera SOCFPGA
编辑-Erlkoenig请求的objdump输出:
test: file format elf32-littlearm
Disassembly of section .init:
000004f4 <_init>:
4f4: e92d4008 push {r3,lr}
4f8: eb000035 bl 5d4 <call_weak_fn>
4fc: e8bd8008 pop {r3,pc}
Disassembly of section .plt:
00000500 <.plt>:
500: e52de004 push {lr} ; (str lr,[sp,#-4]!)
504: e59fe004 ldr lr,[pc,#4] ; 510 <.plt+0x10>
508: e08fe00e add lr,pc,lr
50c: e5bef008 ldr pc,[lr,#8]!
510: 00010a9c .word 0x00010a9c
00000514 <__cxa_finalize@plt>:
514: e28fc600 add ip,#0,12
518: e28cca10 add ip,ip,#16,20 ; 0x10000
51c: e5bcfa9c ldr pc,[ip,#2716]! ; 0xa9c
00000520 <printf@plt>:
520: e28fc600 add ip,12
524: e28cca10 add ip,20 ; 0x10000
528: e5bcfa94 ldr pc,#2708]! ; 0xa94
0000052c <pthread_self@plt>:
52c: e28fc600 add ip,12
530: e28cca10 add ip,20 ; 0x10000
534: e5bcfa8c ldr pc,#2700]! ; 0xa8c
00000538 <__stack_chk_fail@plt>:
538: e28fc600 add ip,12
53c: e28cca10 add ip,20 ; 0x10000
540: e5bcfa84 ldr pc,#2692]! ; 0xa84
00000544 <pthread_create@plt>:
544: e28fc600 add ip,12
548: e28cca10 add ip,20 ; 0x10000
54c: e5bcfa7c ldr pc,#2684]! ; 0xa7c
00000550 <puts@plt>:
550: e28fc600 add ip,12
554: e28cca10 add ip,20 ; 0x10000
558: e5bcfa74 ldr pc,#2676]! ; 0xa74
0000055c <__libc_start_main@plt>:
55c: e28fc600 add ip,12
560: e28cca10 add ip,20 ; 0x10000
564: e5bcfa6c ldr pc,#2668]! ; 0xa6c
00000568 <__gmon_start__@plt>:
568: e28fc600 add ip,12
56c: e28cca10 add ip,20 ; 0x10000
570: e5bcfa64 ldr pc,#2660]! ; 0xa64
00000574 <pthread_join@plt>:
574: e28fc600 add ip,12
578: e28cca10 add ip,20 ; 0x10000
57c: e5bcfa5c ldr pc,#2652]! ; 0xa5c
00000580 <abort@plt>:
580: e28fc600 add ip,12
584: e28cca10 add ip,20 ; 0x10000
588: e5bcfa54 ldr pc,#2644]! ; 0xa54
Disassembly of section .text:
0000058c <_start>:
58c: f04f 0b00 mov.w fp,#0
590: f04f 0e00 mov.w lr,#0
594: bc02 pop {r1}
596: 466a mov r2,sp
598: b404 push {r2}
59a: b401 push {r0}
59c: f8df a024 ldr.w sl,#36] ; 5c4 <_start+0x38>
5a0: a308 add r3,#32 ; (adr r3,5c4 <_start+0x38>)
5a2: 449a add sl,r3
5a4: f8df c020 ldr.w ip,#32] ; 5c8 <_start+0x3c>
5a8: f85a c00c ldr.w ip,[sl,ip]
5ac: f84d cd04 str.w ip,#-4]!
5b0: 4b06 ldr r3,#24] ; (5cc <_start+0x40>)
5b2: f85a 3003 ldr.w r3,r3]
5b6: 4806 ldr r0,#24] ; (5d0 <_start+0x44>)
5b8: f85a 0000 ldr.w r0,r0]
5bc: f7ff efce blx 55c <__libc_start_main@plt>
5c0: f7ff efde blx 580 <abort@plt>
5c4: 000109e8 .word 0x000109e8
5c8: 00000034 .word 0x00000034
5cc: 00000048 .word 0x00000048
5d0: 0000004c .word 0x0000004c
000005d4 <call_weak_fn>:
5d4: e59f3014 ldr r3,#20] ; 5f0 <call_weak_fn+0x1c>
5d8: e59f2014 ldr r2,#20] ; 5f4 <call_weak_fn+0x20>
5dc: e08f3003 add r3,r3
5e0: e7932002 ldr r2,[r3,r2]
5e4: e3520000 cmp r2,#0
5e8: 012fff1e bxeq lr
5ec: eaffffdd b 568 <__gmon_start__@plt>
5f0: 000109c8 .word 0x000109c8
5f4: 00000044 .word 0x00000044
000005f8 <deregister_tm_clones>:
5f8: 4806 ldr r0,#24] ; (614 <deregister_tm_clones+0x1c>)
5fa: 4b07 ldr r3,#28] ; (618 <deregister_tm_clones+0x20>)
5fc: 4478 add r0,pc
5fe: 4a07 ldr r2,#28] ; (61c <deregister_tm_clones+0x24>)
600: 447b add r3,pc
602: 4283 cmp r3,r0
604: 447a add r2,pc
606: d003 beq.n 610 <deregister_tm_clones+0x18>
608: 4b05 ldr r3,#20] ; (620 <deregister_tm_clones+0x28>)
60a: 58d3 ldr r3,[r2,r3]
60c: b103 cbz r3,610 <deregister_tm_clones+0x18>
60e: 4718 bx r3
610: 4770 bx lr
612: bf00 nop
614: 00010a08 .word 0x00010a08
618: 00010a04 .word 0x00010a04
61c: 000109a4 .word 0x000109a4
620: 0000003c .word 0x0000003c
00000624 <register_tm_clones>:
624: 4808 ldr r0,#32] ; (648 <register_tm_clones+0x24>)
626: 4909 ldr r1,#36] ; (64c <register_tm_clones+0x28>)
628: 4478 add r0,pc
62a: 4a09 ldr r2,#36] ; (650 <register_tm_clones+0x2c>)
62c: 4479 add r1,pc
62e: 1a09 subs r1,r1,r0
630: 447a add r2,pc
632: 0fcb lsrs r3,#31
634: eb03 01a1 add.w r1,r3,asr #2
638: 1049 asrs r1,#1
63a: d003 beq.n 644 <register_tm_clones+0x20>
63c: 4b05 ldr r3,#20] ; (654 <register_tm_clones+0x30>)
63e: 58d3 ldr r3,r3]
640: b103 cbz r3,644 <register_tm_clones+0x20>
642: 4718 bx r3
644: 4770 bx lr
646: bf00 nop
648: 000109dc .word 0x000109dc
64c: 000109d8 .word 0x000109d8
650: 00010978 .word 0x00010978
654: 00000050 .word 0x00000050
00000658 <__do_global_dtors_aux>:
658: b508 push {r3,lr}
65a: 4b0a ldr r3,#40] ; (684 <__do_global_dtors_aux+0x2c>)
65c: 4a0a ldr r2,#40] ; (688 <__do_global_dtors_aux+0x30>)
65e: 447b add r3,pc
660: 447a add r2,pc
662: 781b ldrb r3,#0]
664: b96b cbnz r3,682 <__do_global_dtors_aux+0x2a>
666: 4b09 ldr r3,#36] ; (68c <__do_global_dtors_aux+0x34>)
668: 58d3 ldr r3,r3]
66a: b123 cbz r3,676 <__do_global_dtors_aux+0x1e>
66c: 4b08 ldr r3,#32] ; (690 <__do_global_dtors_aux+0x38>)
66e: 447b add r3,pc
670: 6818 ldr r0,#0]
672: f7ff ef50 blx 514 <__cxa_finalize@plt>
676: f7ff ffbf bl 5f8 <deregister_tm_clones>
67a: 4b06 ldr r3,#24] ; (694 <__do_global_dtors_aux+0x3c>)
67c: 2201 movs r2,#1
67e: 447b add r3,pc
680: 701a strb r2,#0]
682: bd08 pop {r3,pc}
684: 000109a6 .word 0x000109a6
688: 00010948 .word 0x00010948
68c: 00000038 .word 0x00000038
690: 00010992 .word 0x00010992
694: 00010986 .word 0x00010986
00000698 <frame_dummy>:
698: e7c4 b.n 624 <register_tm_clones>
69a: bf00 nop
0000069c <main>:
69c: e92d4800 push {fp,lr}
6a0: e28db004 add fp,sp,#4
6a4: e24dd018 sub sp,#24
6a8: e50b0018 str r0,[fp,#-24] ; 0xffffffe8
6ac: e50b101c str r1,#-28] ; 0xffffffe4
6b0: e59f20b0 ldr r2,#176] ; 768 <main+0xcc>
6b4: e08f2002 add r2,r2
6b8: e59f30ac ldr r3,#172] ; 76c <main+0xd0>
6bc: e7923003 ldr r3,r3]
6c0: e5933000 ldr r3,[r3]
6c4: e50b3008 str r3,#-8]
6c8: e3a03000 mov r3,#0
6cc: e59f309c ldr r3,#156] ; 770 <main+0xd4>
6d0: e08f3003 add r3,r3
6d4: e1a00003 mov r0,r3
6d8: ebffff9c bl 550 <puts@plt>
6dc: ebffff92 bl 52c <pthread_self@plt>
6e0: e50b0010 str r0,#-16]
6e4: e51b1010 ldr r1,#-16]
6e8: e59f3084 ldr r3,#132] ; 774 <main+0xd8>
6ec: e08f3003 add r3,r3
6f0: e1a00003 mov r0,r3
6f4: ebffff89 bl 520 <printf@plt>
6f8: e24b0014 sub r0,fp,#20
6fc: e3a03000 mov r3,#0
700: e59f2070 ldr r2,#112] ; 778 <main+0xdc>
704: e08f2002 add r2,r2
708: e3a01000 mov r1,#0
70c: ebffff8c bl 544 <pthread_create@plt>
710: e50b000c str r0,#-12]
714: e51b3014 ldr r3,#-20] ; 0xffffffec
718: e3a01000 mov r1,#0
71c: e1a00003 mov r0,r3
720: ebffff93 bl 574 <pthread_join@plt>
724: e59f3050 ldr r3,#80] ; 77c <main+0xe0>
728: e08f3003 add r3,r3
72c: e1a00003 mov r0,r3
730: ebffff86 bl 550 <puts@plt>
734: e3a03000 mov r3,#0
738: e59f1040 ldr r1,#64] ; 780 <main+0xe4>
73c: e08f1001 add r1,r1
740: e59f2024 ldr r2,#36] ; 76c <main+0xd0>
744: e7912002 ldr r2,[r1,r2]
748: e5921000 ldr r1,[r2]
74c: e51b2008 ldr r2,#-8]
750: e0321001 eors r1,r2,r1
754: 0a000000 beq 75c <main+0xc0>
758: ebffff76 bl 538 <__stack_chk_fail@plt>
75c: e1a00003 mov r0,r3
760: e24bd004 sub sp,#4
764: e8bd8800 pop {fp,pc}
768: 000108f0 .word 0x000108f0
76c: 00000040 .word 0x00000040
770: 00000130 .word 0x00000130
774: 0000011c .word 0x0000011c
778: 00000078 .word 0x00000078
77c: 000000e8 .word 0x000000e8
780: 00010868 .word 0x00010868
00000784 <start_rtn>:
784: e92d4800 push {fp,lr}
788: e28db004 add fp,#4
78c: e24dd008 sub sp,#8
790: e50b0008 str r0,#-8]
794: e59f3018 ldr r3,#24] ; 7b4 <start_rtn+0x30>
798: e08f3003 add r3,r3
79c: e1a00003 mov r0,r3
7a0: ebffff6a bl 550 <puts@plt>
7a4: e1a00000 nop ; (mov r0,r0)
7a8: e1a00003 mov r0,r3
7ac: e24bd004 sub sp,#4
7b0: e8bd8800 pop {fp,pc}
7b4: 00000080 .word 0x00000080
000007b8 <__libc_csu_init>:
7b8: e92d 43f8 stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,lr}
7bc: 4607 mov r7,r0
7be: 4e0c ldr r6,#48] ; (7f0 <__libc_csu_init+0x38>)
7c0: 4688 mov r8,r1
7c2: 4d0c ldr r5,#48] ; (7f4 <__libc_csu_init+0x3c>)
7c4: 4691 mov r9,r2
7c6: 447e add r6,pc
7c8: f7ff ee94 blx 4f4 <_init>
7cc: 447d add r5,pc
7ce: 1b76 subs r6,r5
7d0: 10b6 asrs r6,#2
7d2: d00a beq.n 7ea <__libc_csu_init+0x32>
7d4: 3d04 subs r5,#4
7d6: 2400 movs r4,#0
7d8: f855 3f04 ldr.w r3,[r5,#4]!
7dc: 3401 adds r4,#1
7de: 464a mov r2,r9
7e0: 4641 mov r1,r8
7e2: 4638 mov r0,r7
7e4: 4798 blx r3
7e6: 42a6 cmp r6,r4
7e8: d1f6 bne.n 7d8 <__libc_csu_init+0x20>
7ea: e8bd 83f8 ldmia.w sp!,pc}
7ee: bf00 nop
7f0: 000106d6 .word 0x000106d6
7f4: 000106cc .word 0x000106cc
000007f8 <__libc_csu_fini>:
7f8: 4770 bx lr
7fa: bf00 nop
Disassembly of section .fini:
000007fc <_fini>:
7fc: e92d4008 push {r3,lr}
800: e8bd8008 pop {r3,pc}
编辑-Here您可以下载两个可执行文件
解决方法
现在我已经花了两天时间解决这个问题,看来已经找到了解决方案。
在RaspberryPi(可成功启动应用程序)上,总有SIGABRT(信号6)带有“检测到堆栈粉碎”。但是这些是无法解释的。因此,我决定通过-fno-stack-protector
暂时禁用它们。
结果:该应用程序也在特殊设备上启动,还没有崩溃。
结合堆栈粉碎,交叉编译器“ gcc-arm-linux-gnueabihf”是否可能存在错误?使用gcc版本7.5.0和版本9.3.0可以重现该问题。
说实话,这个故事使我对构建设置非常怀疑。
这是新的ldd输出:
ldd ./testapp
libpthread.so.0 => /lib/libpthread.so.0 (0xb6f6f000)
libc.so.6 => /lib/libc.so.6 (0xb6e43000)
/lib/ld-linux-armhf.so.3 (0xb6f8e000)
非常感谢所有支持者
, start_rtn
不返回任何内容-即使它为NULL,它也应该返回一些内容。
您可能会发现,在不同的平台上,您将具有不同的未初始化内存和寄存器模式。在大多数平台上,您可能很幸运。
这并不是说加载pthread库也可能存在问题-您是否可以使用gdb
加载程序并至少进入前几行?
还-是否可以选择在目标计算机上安装编译器并执行直接编译?我知道有人在无法使交叉编译器正常工作的情况下在RPI上建立构建服务器;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。