当前位置: 首页 > news >正文

newlibc memcpy 存在问题

背景

sdk 中发现 memcpy 函数没有达到预期,执行后,目的地址与源地址中的内容不一致。

复现方法

通过单步调试 memcpy 汇编代码,发现使用了 ldrh 指令,该指令在对 uncacheable memory 同时该 memory 非对齐的情况下,并不会按照预期执行(从内存 load 两字节到目标寄存器),如下汇编代码。

.text
.global my_memcpy
.type my_memcpy, %function
my_memcpy:push    {r10,lr}ldrh    r10, [r1]  # 如果 r1 不对齐且为 uncacheble,并不会 load 2 字节到 r10strh    r10, [r0]pop     {r10, pc}.size my_memcpy, .-my_memcpy

关闭了非对齐访问检查,所以不会产生 fault

该指令执行结果,如图:在这里插入图片描述

实锤

newlibc 中 memcpy 存在非对齐访问,某些 cpu (cortex-a5 与 cortex-a9)非对齐访问时,行为不一致,可参考 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf 第 109 页。

对于非对齐访问(cpu 使能非对齐访问,SCTLR 寄存器的 bit1),会产生不可预测行为。


http://www.mrgr.cn/news/48796.html

相关文章:

  • Git-bug001 VScode中git clone的地址首次push报错push.default is unset
  • Linux -- 初识动静态库
  • 2024ccna考试时间?新手小白看这些就够了
  • HTB:Cap[WriteUP]
  • 避免 Python 类型转换错误:实用指南
  • 51单片机的智能温控风扇【proteus仿真+程序+报告+原理图+演示视频】
  • 配置WSGI 服务器(Gunicorn)和Nginx 反向代理服务器部署Flask项目
  • Hi电源芯片选型表
  • 手撕数据结构 —— 栈(C语言讲解)
  • java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
  • 完成单位信息宣传考核任务投稿为什么邮箱投稿不香了?
  • 【ProtoBuf】基础使用与编译
  • C# udp通信测试助手-点对点-网络断开检测
  • 在SpringBoot+VUE中 实现登录-RSA的加密解密
  • Spring Boot 项目中 Redis 与数据库性能对比实战:从缓存配置到时间分析,详解最佳实践
  • 【Java知识】java进阶-手撕动态代理
  • 【AI论文精读12】RAG论文综述2(微软亚研院 2409)P4-隐性事实查询L2
  • 16路舵机控制芯片lu9685使用技巧
  • 数据结构-5.4.二叉树的性质
  • 认识C++的变量与整型