首页 技术 正文
技术 2022年11月12日
0 收藏 372 点赞 3,337 浏览 2750 个字

一、测试原因

在学习u-boot的环境变量过程中,看到有如此的代码,现对涉及到的内容进行实验测试。

二、测试目的

1、了解gcc允许对段的属性进行更改的方法。

2、解决”ENV_IS_EMBEDDED“解惑以及相关的移植实验中如何将环境变量(结构体变量environment)定位在代码段的0x33f84000的位置,以实现环境变量区嵌入到代码段的功能。

三、测试原理(参考attribute 用法 section 部分

gcc通过选项__attribute__可以改变所声明或定义的函数、数据的特性。它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。但这里我们比较感兴趣的是对代码段起作用子项section。

__attribute__的section子项的使用格式为:

__attribute__((section("section_name")))

其作用是将作用的函数或数据放入指定名为”section_name”输入段。

输入段和输出段

输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的。

Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o 文件中包含的段相对link过程来说就是输入段,而Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。输入段和输出段本来没有什么必然的联系,是互相独立。只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。

需要着重注意的是,__attribute__的section属性只指定对象的输入段,它并不能影响所指定对象最终会放在可执行文件的什么段。

举例如下:

更改变量的段属性

定义的变量var将被放入名为.xdata的输入段,(注意:__attribute__这种用法中的括号好像很严格,这里的几个括号好象一个也不能少。)

int var __attribute__((section(".xdata"))) = ;

更改函数的段属性

这个例子将使函数functionA被放入名叫.xinit的输入段。

static int __attribute__((section(".xinit"))) functionA(void){.....
}

四、测试代码

测试代码主要是从common/environment.c中摘取的,以测试本应该放在数据段(.data)的environment如何嵌入到代码段。

1、start.S

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@****************************************************************************** .text
.global _start
_start:
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop

2、main.c

int DATA = ;
int BSS;
const int RODATA = ; int main(void)
{
return ;
}

3、environment.c

#define __PPCENV__  __attribute__ ((section(".text")))asm (".globl " "env_offset"); //定义全局变量env_offset以供连接脚本调用
asm ("env_offset" " = " "0x04000");#define CFG_ENV_SIZE 0x2000 //环境变量大小
# define ENV_HEADER_SIZE (sizeof(unsigned long))
#define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE)typedef struct environment_s {
unsigned long crc; /* CRC32 over data bytes */
unsigned char data[ENV_SIZE]; /* Environment data */
} env_t;env_t environment __PPCENV__ = { //将environment的数据段属性更改为代码段
,
"this is in environment!\n"
};

4、environment.lds

SECTIONS {
. = 0x00000000;
. = ALIGN();
.text :
{
start.o (.text);
. = env_offset;
environment.o(.text);
*(.text)
}
. = ALIGN();
.rodata : { *(.rodata) }
. = ALIGN();
.data : { *(.data) }
. = ALIGN();
.bss : { *(.bss) }}

五、测试结果

Disassembly of section .text: <_start>:
: eb0017fe bl <main> <halt_loop>:
: eafffffe b <halt_loop>
...00004000 <environment>:
: andeq r0, r0, r1
: cmnvc r9, # ; 0x740000
: rsbcss r6, r3, r0, lsr #
400c: 65206e69 strvs r6, [r0, #-]!
: 7269766e rsbvc r7, r9, # ; 0x6e00000
: 656d6e6f strvsb r6, [sp, #-]!
: 0a21746e beq 8611d8 <BSS+0x85b1b8>
... <main>:
: e1a0c00d mov ip, sp
: e92dd800 stmdb sp!, {fp, ip, lr, pc}
: e24cb004 sub fp, ip, # ; 0x4
600c: e3a03000 mov r3, # ; 0x0
: e1a00003 mov r0, r3
: e89da800 ldmia sp, {fp, sp, pc}
Disassembly of section .rodata: <RODATA>:
: andeq r0, r0, r5
Disassembly of section .data:0000601c <DATA>:
601c: andeq r0, r0, r5
Disassembly of section .bss: <BSS>:
: andeq r0, r0, r0
Disassembly of section .comment:

参考:attribute 用法 section 部分

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,023
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,360
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,143
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,774
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,852