摘要: 在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法。将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件,即可以实现模块调用系统函数的问题。 在stm32上做了以下实验,kernel导出一个系统函数v... 阅读全文
posted @ 2014-04-17 23:02 ppym 阅读(2802) 评论(4) 推荐(0) 编辑
摘要: 上一篇关于动态加载讲述的是M3下面的ropi的实现细节,这一篇则讲述RW段的实现细节以及系统加载RW段的思路,我在M3上根据这个思路可以实现elf的动态加载,当然进一步的可以优化很多东西,还可以研究将bin加载起来,这个需要一些辅助的东西实现。言归正文,使用/acps/rwpi编译代码,解决RW段即... 阅读全文
posted @ 2014-04-16 23:34 ppym 阅读(4285) 评论(3) 推荐(2) 编辑
摘要: 这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈。编译C代码时候需要制定--acps/ropi选项,如下例子: 1 void SystemInit(void) 2 { 3 } 4 void fun_for_sub(void) 5 { 6 int j; 7 for(j=65535;j >=0; j--) 8 ; 9 }10 int main(void)11 {12 fun_for_sub();13 while(1);14 }C-example编译:armcc -c... 阅读全文
posted @ 2014-04-09 23:08 ppym 阅读(3855) 评论(3) 推荐(0) 编辑
摘要: 按照C编译器编译的结果,一般会产生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量。那么如下的代码1 int aaa;2 int bbb;3 4 int main()5 {6 aaa = 7;7 bbb = 8;8 return 0;9 }应该产生的是八个字节的ZI段,但很奇怪,--bss_threshold=0Program Size: Code=464 RO-data=268 RW-data=8 ZI-data=608 如上所示,其中的Code段,RO-data段和ZI-data段是启动... 阅读全文
posted @ 2014-03-24 23:42 ppym 阅读(3121) 评论(0) 推荐(0) 编辑
摘要: 最近比较一下KEIL和IAR两个编译器产生的代码,基于Cortex-M3处理器的,然后发现了一几个奇怪的地方。很简单的一个C的for循环 1 void fun_for_add_65535(void) 2 { 3 int i; 4 for (i=0; i<65535; i++) 5 ; 6 } 7 8 void fun_for_add_65536(void) 9 {10 int i;11 for (i=0; i<65536; i++)12 ;13 }按道理这两个函数除了for的终止值不同之外,产生的汇编代码应该不会有什么差异。但是... 阅读全文
posted @ 2014-03-19 21:37 ppym 阅读(1697) 评论(1) 推荐(0) 编辑