WZH 发表于 2022-2-23 15:06:55

xad74 发表于 2022-2-22 08:03
好东西,这样是不是就意为着当程序出现问题时不用整体更新了,只需更新问题程序就行

morning_enr6U 发表于 2022-4-9 18:45:21

楼主还在更新吗? 谢谢!{:3:}

WZH 发表于 2022-4-9 21:10:59

morning_enr6U 发表于 2022-4-9 18:45
楼主还在更新吗? 谢谢!

兄弟还惦记呢,明天我试着在更新下{:8:}

jasondong388 发表于 2022-4-10 10:58:31

WZH 发表于 2022-4-9 21:10
兄弟还惦记呢,明天我试着在更新下

:victory::hug:

morning_enr6U 发表于 2022-4-10 19:31:36

期待更新,好东西自然有粉丝{:34:}

WZH 发表于 2022-4-15 20:17:22

morning_enr6U 发表于 2022-4-10 19:31
期待更新,好东西自然有粉丝

已经更新啦{:34:}

morning_enr6U 发表于 2022-4-15 22:27:10

已经找到你开的新帖了, 写得非常好,学习中!!!{:8:}{:8:}{:8:}

WZH 发表于 2022-4-16 00:32:29

morning_enr6U 发表于 2022-4-15 22:27
已经找到你开的新帖了, 写得非常好,学习中!!!

加油!欢迎交流

wander 发表于 2022-4-19 08:59:15

看了这个帖子,我对跳转与动态加载的区别有了更深刻的理解,学无止境

jiaoxiake 发表于 2022-4-19 12:27:43

楼主大牛啊!

jiaoxiake 发表于 2022-4-19 12:28:44

学习了!!!:)

renzhen 发表于 2022-4-20 15:58:27

楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址

renzhen 发表于 2022-4-20 16:01:24

楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址

WZH 发表于 2022-4-20 17:33:05

renzhen 发表于 2022-4-20 15:58
楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址

可以详细说说嘛,最好有图片

renzhen 发表于 2022-4-20 18:30:32

源码和反汇编以及readelf

WZH 发表于 2022-4-20 19:19:00

renzhen 发表于 2022-4-20 18:30
源码和反汇编以及readelf

这没问题,第一个Relocation为代码中引用全局变量的地址,这个肯定是不同的。
第二个是符号值,这个符号值其实是代表的这个全局变量在整个elf文件中的偏移地址,代码中多次引用同一个全局变量就会出现这种情况。

renzhen 发表于 2022-4-20 20:33:43

WZH 发表于 2022-4-20 19:19
这没问题,第一个Relocation为代码中引用全局变量的地址,这个肯定是不同的。
第二个是符号值,这个符号 ...

str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下,里面有三对movw movt需要重定位, offset 0006 000e 这一对是获取str的地址,其他两对是本来分别是要获取"hello world\r\n" 和 "test string\r\n" 的地址, 但是后面两对都是获取"hello world\r\n"字符串的地址.

WZH 发表于 2022-4-21 09:37:11

renzhen 发表于 2022-4-20 20:33
str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下, ...

这汇编确实有点问题,你用的编译器版本是什么呀,我一样的代码,和你的反汇编完全不一样。
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093251.png
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093439.png
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093453.png

WZH 发表于 2022-4-21 09:39:05

renzhen 发表于 2022-4-20 20:33
str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下, ...

建议检查一下,重新编译生成一下试试

WZH 发表于 2022-4-21 09:40:57

renzhen 发表于 2022-4-21 13:17:12

这是我的版本截图,你的也发下我看看是不是版本不一样

renzhen 发表于 2022-4-21 13:25:03

WZH 发表于 2022-4-21 09:40


你把你现在截图生成的.axf文件使用readelf 查下重定位的代码,截图下我看看

renzhen 发表于 2022-4-21 13:30:21

WZH 发表于 2022-4-21 09:40


你工程配置是不是改掉了?

WZH 发表于 2022-4-21 13:51:52


我用的不是readelf工具查看的,使用的是fromelf查看,我直接把程序镜像还有源码给你吧,你自己找找看看哪里不同。

renzhen 发表于 2022-4-21 14:20:49

WZH 发表于 2022-4-21 13:51
我用的不是readelf工具查看的,使用的是fromelf查看,我直接把程序镜像还有源码给你吧,你自己找找看看哪 ...

用你DLL_PROG.zip编译的和你的结果一样,也就是说跟你原来的工程(APP_Elf_Generate.zip)是不一样的.
希望楼主能研究出一个确实可用的工程(考虑到大代码量时遇到的种种问题).

lindabell 发表于 2022-4-23 09:20:40

contiki里面也实现了动态加载

https://github.com/contiki-os/contiki/blob/master/core/loader/elfloader.c

eric2013 发表于 2022-4-23 09:29:55

lindabell 发表于 2022-4-23 09:20
contiki里面也实现了动态加载

https://github.com/contiki-os/contiki/blob/master/core/loader/elfload ...
好资料,分享下
The dynamic loader · contiki-os/contiki Wiki (github.com)

zhengwending 发表于 2022-5-4 16:47:52

sxw101320 发表于 2021-12-5 18:06
牛,之前做国网产品的时候,国网提供的操作系统就是动态加载app,知道是rtt的lwp模块,但是一直没有弄清楚 ...

在做国网产品?

sxw101320 发表于 2022-5-5 21:22:26

zhengwending 发表于 2022-5-4 16:47
在做国网产品?

之前做,离开一年了

会飞的猪_2020 发表于 2022-5-18 13:47:20

gitee仓库要公开申请。
之前我的仓库现在都无法访问了,估计楼主你的仓库也这样了。

这波操作难道是为了配合净网???
感觉被恶心到了。
但是github连接实在太慢了,只能用gitee..

WZH 发表于 2022-5-18 23:23:11

会飞的猪_2020 发表于 2022-5-18 13:47
gitee仓库要公开申请。
之前我的仓库现在都无法访问了,估计楼主你的仓库也这样了。



确实挺恶心的,刚刚才知道gitee有这个问题,已经申请了

chenyingchun 发表于 2022-5-21 19:53:05

WZH 发表于 2021-12-5 19:13
大家可以在评论下动态加载的实战意义大不大,如果大的话,我后面写一篇详细一点的关于实现原理的技术文档。 ...

动态加载,有时挺有用的,我总结了几个场景:
应用场景分析
1. 我们目前在MCU上跑dlmodule,可能更多是抱着学习,了解原理的心态,一般来说,
动态模块会使用在RAM大于4MB的平台中。
2. 动态模块可以对未来不可预知的一些功能的扩展
3. 可以做到类似于安卓app,把一些特殊功能的应用交给第三方的模块独立完成
4. 调试使用,比如调试某个具体功能时,如果每次都修改整个项目工程的源码,然后
    编译,下载,如果整体烧写flash效率比较低,此时就可以使用动态模块调试

leeeeeeeeee 发表于 2022-5-25 14:07:07

WZH 发表于 2021-12-14 20:38
对,我的实现方法和这篇文章大体思路是一样的,但在具体操作上略有不同。我没做符号表的支持,也就 ...

不知道是否可以通过APP工程生成的.o文件连接base工程生成的elf内函数和变量的地址,完成APP.bin文件生成

471813942 发表于 2022-5-27 14:54:41

对于这些如何移植过来,还有一些疑问,实际自己需要动态加载的.axf和动态解析的功能模块是怎么工程配置的呢?

WZH 发表于 2022-5-27 15:54:35

471813942 发表于 2022-5-27 14:54
对于这些如何移植过来,还有一些疑问,实际自己需要动态加载的.axf和动态解析的功能模块是怎么工程配置的呢 ...

基于STM32动态加载实现原理V1.0
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112099&fromuid=24016
(出处: 硬汉嵌入式论坛)
可参考此帖子的内容

WZH 发表于 2022-5-27 15:56:56

leeeeeeeeee 发表于 2022-5-25 14:07
不知道是否可以通过APP工程生成的.o文件连接base工程生成的elf内函数和变量的地址,完成APP.bin文件生成

这个不太好实现,因为在每次编译工程时,函数地址一般都会变化。

pokemonds 发表于 2022-10-15 13:28:53

用楼主的工程没有生成SHT_REL的,MDK5.37,是哪里不对吗?

pokemonds 发表于 2022-10-15 13:29:31

** ELF Header Information

    File Name: dll_generate.axf

    Machine class: ELFCLASS32 (32-bit)
    Data encoding: ELFDATA2LSB (Little endian)
    Header version: EV_CURRENT (Current version)
    Operating System ABI: ARM BPABI with Symbol Versioning
    ABI Version: 0
    File Type: ET_EXEC (Executable) (2)
    Machine: EM_ARM (ARM)

    Image Entry point: 0x00000005
    Flags: EF_ARM_HASENTRY + EF_ARM_ABI_FLOAT_HARD (0x05000402)

    ARM ELF revision: 5 (ABI version 2)

    Conforms to Hard float procedure-call standard

    Header size: 52 bytes (0x34)
    Program header entry size: 32 bytes (0x20)
    Section header entry size: 40 bytes (0x28)

    Program header entries: 3
    Section header entries: 10

    Program header offset: 52 (0x00000034)
    Section header offset: 756 (0x000002f4)

    Section header string table index: 9

========================================================================

** Program header #0 (PT_LOAD)
    Size : 180 bytes
    Virtual address: 0x00000000 (Alignment 4)


====================================

** Program header #1 (PT_LOAD)
    Size : 0 bytes
    Virtual address: 0x000000b4 (Alignment 4)


====================================

** Program header #2 (PT_DYNAMIC)
    Size : 96 bytes
    Virtual address: 0x00000000 (Alignment 4)


========================================================================

** Section #1 'ER_IROM1' (SHT_PROGBITS)
    Size   : 180 bytes (alignment 4)
    Address: 0x00000000


** Section #2 '.dynstr' (SHT_STRTAB)
    Size   : 52 bytes


** Section #3 '.dynsym' (SHT_DYNSYM)
    Size   : 64 bytes (alignment 4)
    String table #2 '.dynstr'
    Last local symbol no. 0


** Section #4 '.hash' (SHT_HASH)
    Size   : 36 bytes (alignment 4)
    Symbol table #3 '.dynsym'


** Section #5 '.version' (SHT_GNU_versym)
    Size   : 8 bytes (alignment 4)
    Symbol table #3 '.dynsym'


** Section #6 '.version_d' (SHT_GNU_verdef)
    Size   : 56 bytes (alignment 4)
    String table #2 '.dynstr'


** Section #7 '.dynamic' (SHT_DYNAMIC)
    Size   : 96 bytes (alignment 4)
    String table #2 '.dynstr'


** Section #8 '.note' (SHT_NOTE)
    Size   : 20 bytes (alignment 4)


** Section #9 '.shstrtab' (SHT_STRTAB)
    Size   : 96 bytes

WZH 发表于 2022-10-15 19:55:38

pokemonds 发表于 2022-10-15 13:29
** ELF Header Information

    File Name: dll_generate.axf


用我gitee仓库里的程序版本试试,原本的版本貌似有问题
https://gitee.com/wzh1845462801/dynamic_loader

WZH 发表于 2022-10-15 20:04:06

pokemonds 发表于 2022-10-15 13:29
** ELF Header Information

    File Name: dll_generate.axf


程序中如果没有静态变量的话也会出现这种情况,因为这时程序中不需要引用任何变量的地址,自然也就没有用重定位的节区了
页: 1 2 [3] 4 5
查看完整版本: 论坛首发,STM32实现动态加载模组(似于Windows的dll),使用MDK编译动态库类