问题分析及记录../sysdeps/x86_64/multiarch/../memcpy.S: 没有那个文件或目录.

在Linux项目开发中,运行人脸检测程序出现'./sysdeps/x86_64/multiarch/../memcpy.S:没有文件或目录'错误。经排查,并非memcpy操作问题,而是电脑安装的sdl2库与程序需求的sdl1版本不匹配。卸载重装sdl1版本库后,程序成功运行,说明库版本会影响程序运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Linux的项目开发中,今天运行程序时出现:./sysdeps/x86_64/multiarch/../memcpy.S:没有文件或目录错误。该程序是进行人脸检测的,其有用到gtk、sdl库,因为我虚拟机已经有sdl2版本的库,所以很快就编译过了,但是运行却出错了,段错误。

折腾了一下,先是百度搜索,看到说一般不是因为缺少该文件,而是因为memcpy操作时可能数组溢出、或者空指针问题,然后我用gdb调试跟进去一看似乎并不是这个问题。

 

(gdb) r pictures/man.jpg
Starting program: /home/qihua/myhome/Facecatch-master/src/facecatch pictures/man.jpg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2 () at ../sysdeps/x86_64/multiarch/../memcpy.S:201
201    ../sysdeps/x86_64/multiarch/../memcpy.S: 没有那个文件或目录.
(gdb) bt
#0  __memcpy_sse2 () at ../sysdeps/x86_64/multiarch/../memcpy.S:201
#1  0x00007ffff70aa323 in __GI__IO_file_xsgetn (fp=0x618010, 
    data=<optimized out>, n=84) at fileops.c:1387
#2  0x00007ffff709f86f in __GI__IO_fread (buf=<optimized out>, size=1, 
    count=84, fp=0x618010) at iofread.c:42
#3  0x00007ffff7b55d8e in ?? () from /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0
#4  0x00007ffff7921415 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so.0
#5  0x00007ffff7921141 in IMG_LoadTyped_RW ()
   from /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so.0
#6  0x0000000000414942 in load_image (path=0x7fffffffe2a7 "pictures/man.jpg")
    at sdl_functions.c:49
#7  0x00000000004156eb in facial_recognition (
    path=0x7fffffffe2a7 "pictures/man.jpg") at sdl_functions.c:354
#8  0x0000000000400fcc in main (argc=2, argv=0x7fffffffdf18) at facecatch.c:7

 

然后想到我电脑安装的sdl2以及sdl2-image库,而程序需求的是sdl1版本的库,虽然一开始能够编译过,但是运行时却报错了,于是我把库卸载重新安装了sdl1版本及相关的库文件,后面就成功运行了。

总结:库的版本也可能影响程序的正确运行与否。

附:人脸检测源码下载链接:https://github.com/evadeo/Facecatch

附:SDL相关库的安装介绍blog:https://blog.youkuaiyun.com/mleem/article/details/51222156

 


 

<think>嗯,用户遇到了程序崩溃的问题,具体是SIGSEGV段错误,可能与strcpy函数在x86_64架构下使用sse2-unaligned实现的汇编有关。首先,我需要回忆一下段错误的常见原因,比如内存访问越界、使用野指针、栈溢出等。而strcpy如果处理不当,比如目标缓冲区不够大,就会导致缓冲区溢出,进而引发段错误。 接下来,用户提到的是strcpy-sse2-unaligned,这应该是glibc中针对特定CPU优化的strcpy实现。可能是在处理非对齐内存访问时触发了错误。x86_64通常允许非对齐访问,但某些情况下,比如使用SIMD指令时,非对齐访问可能导致性能问题错误。需要确认是否在复制过程中访问了不可读不可写的内存区域。 调试方面,用户可能需要使用gdb来分析core dump文件,找到崩溃的具体位置。查看汇编代码可以帮助确认是否在strcpy的优化实现中发生了问题。此外,检查源码中的strcpy调用,确保目标缓冲区足够大,并且指针有效。 另外,用户提供的引用中有提到使用gdb调试段错误的方法,比如查看backtrace,检查寄存器状态,以及使用Valgrind进行内存检测。这些都是有效的步骤。可能需要建议用户检查他们的代码中的内存管理,特别是使用strcpy的地方,考虑使用更安全的函数如strncpy者启用编译器保护选项如-fstack-protector。 可能还需要考虑glibc的版本是否存在已知的问题者是否有相关的补丁需要应用。如果问题确实出现在glibc的strcpy实现中,可能需要查看对应的源码反汇编,确认崩溃点的指令是否合法,是否有内存访问越界的情况。 总结一下,解决步骤应该是:1)复现问题并生成core文件;2)使用gdb分析core文件,确定崩溃位置;3)检查对应的源码,特别是strcpy的使用;4)使用Valgrind检测内存错误;5)考虑替换为更安全的函数启用编译器保护;6)查看glibc的版本和可能的补丁。</think>### SIGSEGV段错误分析与strcpy相关汇编调试指南 #### 一、段错误触发机制 SIGSEGV信号由非法内存访问触发,常见于以下场景: 1. 访问未初始化/已释放指针 2. 缓冲区溢出(如strcpy目标缓冲区不足) 3. 栈空间耗尽 4. 内存对齐问题(与sse2-unaligned实现相关)[^5] #### 二、strcpy汇编实现分析x86_64架构下,glibc的`strcpy-sse2-unaligned`实现采用SIMD指令优化: ```nasm movdqu (%rsi), %xmm0 ; SSE2非对齐加载指令 movdqu %xmm0, (%rdi) ; 非对齐存储 ``` 当源/目标地址未按16字节对齐时可能触发异常,但x86架构通常允许非对齐访问[^4] #### 三、调试步骤 1. **生成调试信息** ```bash gdb ./your_program core # 确保安装调试符号 debuginfo-install glibc-2.17-260.el7_6.6.x86_64 # 如引用[1]所示 ``` 2. **定位崩溃点** ```gdb (gdb) bt full # 查看完整调用栈 (gdb) disassemble # 查看汇编上下文 (gdb) info registers rsi rdi # 查看关键寄存器值 ``` 3. **内存有效性验证 ```gdb (gdb) x/10x $rsi # 检查源地址是否可读 (gdb) x/10x $rdi # 检查目标地址是否可写 ``` #### 四、常见问题排查 1. **缓冲区溢出验证** ```c char dest[8]; strcpy(dest, "this_is_over_8_chars"); // 必然触发溢出 ``` 2. **内存对齐检查** ```bash (gdb) print/x (unsigned long)ptr % 16 # 检查地址对齐情况 ``` #### 五、优化建议 1. 替换为安全函数: ```c strncpy(dest, src, sizeof(dest)-1); dest[sizeof(dest)-1] = '\0'; ``` 2. 启用编译保护: ```bash gcc -fstack-protector-strong -Wformat-security ``` 3. 使用内存调试工具: ```bash valgrind --tool=memcheck ./your_program ``` #### 六、glibc版本验证 ```bash ldd --version # 查看glibc版本 objdump -d /lib64/libc.so.6 | less # 反汇编验证strcpy实现 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值