Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
arm
mo动态模块_Module
5
关于dlmodule的relocation问题
发布于 2021-04-06 17:05:42 浏览:1591
订阅该版
目前准备着手编写让rtt dmodule支持riscv的代码,仿照rtt下arm.c 以及x86.c , 现在对比发现目前`arm.c` switch中支持的`symbol table index and type` 就那么几个,我想知道为啥只写那么几个。 而完整的code是多达100多个,见截图: ```c int dlmodule_relocate(struct rt_dlmodule *module, Elf32_Rel *rel, Elf32_Addr sym_val) { Elf32_Addr *where, tmp; Elf32_Sword addend, offset; rt_uint32_t upper, lower, sign, j1, j2; where = (Elf32_Addr *)((rt_uint8_t *)module->mem_space + rel->r_offset - module->vstart_addr); switch (ELF32_R_TYPE(rel->r_info)) { case R_ARM_NONE: break; case R_ARM_ABS32: *where += (Elf32_Addr)sym_val; RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_ABS32: %x -> %x\n", where, *where)); break; case R_ARM_PC24: case R_ARM_PLT32: case R_ARM_CALL: case R_ARM_JUMP24: addend = *where & 0x00ffffff; if (addend & 0x00800000) addend |= 0xff000000; tmp = sym_val - (Elf32_Addr)where + (addend << 2); tmp >>= 2; *where = (*where & 0xff000000) | (tmp & 0x00ffffff); RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_PC24: %x -> %x\n", where, *where)); break; case R_ARM_REL32: *where += sym_val - (Elf32_Addr)where; RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_REL32: %x -> %x, sym %x, offset %x\n", where, *where, sym_val, rel->r_offset)); break; case R_ARM_V4BX: *where &= 0xf000000f; *where |= 0x01a0f000; break; case R_ARM_GLOB_DAT: case R_ARM_JUMP_SLOT: *where = (Elf32_Addr)sym_val; RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_JUMP_SLOT: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val)); break; #if 0 /* To do */ case R_ARM_GOT_BREL: temp = (Elf32_Addr)sym_val; *where = (Elf32_Addr)&temp; RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_GOT_BREL: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val)); break; #endif case R_ARM_RELATIVE: *where = (Elf32_Addr)sym_val + *where; RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_ARM_RELATIVE: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val)); break; case R_ARM_THM_CALL: case R_ARM_THM_JUMP24: upper = *(rt_uint16_t *)where; lower = *(rt_uint16_t *)((Elf32_Addr)where + 2); sign = (upper >> 10) & 1; j1 = (lower >> 13) & 1; j2 = (lower >> 11) & 1; offset = (sign << 24) | ((~(j1 ^ sign) & 1) << 23) | ((~(j2 ^ sign) & 1) << 22) | ((upper & 0x03ff) << 12) | ((lower & 0x07ff) << 1); if (offset & 0x01000000) offset -= 0x02000000; offset += sym_val - (Elf32_Addr)where; if (!(offset & 1) || offset <= (rt_int32_t)0xff000000 || offset >= (rt_int32_t)0x01000000) { rt_kprintf("Module: Only Thumb addresses allowed\n"); return -1; } sign = (offset >> 24) & 1; j1 = sign ^ (~(offset >> 23) & 1); j2 = sign ^ (~(offset >> 22) & 1); *(rt_uint16_t *)where = (rt_uint16_t)((upper & 0xf800) | (sign << 10) | ((offset >> 12) & 0x03ff)); *(rt_uint16_t *)(where + 2) = (rt_uint16_t)((lower & 0xd000) | (j1 << 13) | (j2 << 11) | ((offset >> 1) & 0x07ff)); upper = *(rt_uint16_t *)where; lower = *(rt_uint16_t *)((Elf32_Addr)where + 2); break; default: return -1; } return 0; } ``` ![image.png](https://oss-club.rt-thread.org/uploads/20210406/5299cec0b8242325580115f4a12d5e91.png)
查看更多
1
个回答
默认排序
按发布时间排序
flashman2002
2021-04-06
这家伙很懒,什么也没写!
需要不断完善补充。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
xiaoyu
这家伙很懒,什么也没写!
提问
27
回答
27
被采纳
1
关注TA
发私信
相关问题
1
貌似stm32f10x的应用模块在1.2.x版本不能正常编译
2
应用模块打开之后unload之后还在内存中
3
关于module.c的_load_shared_object的疑问
4
应用模块的rt_module_unload函数的bug
5
rtt 如何实现动态加载app
6
使用zmodem传输文件,应用模块文件传输完成,访问失败
7
RTT下应用模块编译具体方法
8
RTT应用模块编译出错
9
RTT应用模块编译问题
10
求问动态模块是什么意思呢
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
14
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部