链接器中——链接脚本
链接脚本
链接器根据说明具体的原则完成具体的工作?
答案是:链接脚本。
成都创新互联公司拥有一支富有激情的企业网站制作团队,在互联网网站建设行业深耕10余年,专业且经验丰富。10余年网站优化营销经验,我们已为千余家中小企业提供了网站设计制作、成都网站制作解决方案,按需求定制设计,设计满意,售后服务无忧。所有客户皆提供一年免费网站维护!
1链接脚本的意义
链接脚本用于描述链接器处理目标文件和库文件的方式
1.合并各个目标文件中的段
2.重定位各个段的起始地址
3.重定位各个符号的最终地址
SECTIONS // 关键字,描述各个段在内存中的布局
{
.text 0x08048400: // 代码段起始地址
{
*(.text) // 所有文件的代码段合并进入可执行程序
}
. = 0x01000000; // 设当前地址
s1 = .; // 标识符S的存储地址
. += 4;
s2 = .;
.data 0x0804a800:
{
*(.data)
}
.bss :
{
*(.bss)
}
}
注意事项:
1.各个段的链接地址必须符合具体的平台规范
2.链接脚本中能够直接定义标识符并指定存储地址
3.链接标本中能够指定源代码中的标识符的存储地址
4.在Linux中,进程代码段(.text)的合法起始地址为【0x08048000,0x08049000】
2 MEMORY的使用
默认情况下:链接器认为程序应该加载进入同一个个存储空间。
嵌入式系统中,如果存在多个存储空间,必须使用MEMORY进行存储区域定义。
MEMORY 的属性定义:
MEMORY
{
RAM0 (WX) : ORIGIN = 0X20000000, LENGTH = 1024K
RAM1 (!X) : ORIGIN = 0X04000000, LENGTH = 256K
}
SECTION
{
.text : { *(.text) } > RAM0
.data : { *(.data) } > RAM0
.bss : { *(.bss) } > RAM1
}
3 ENTRY 命令指定入口点
ENTRY(program)
SECTIONS
{
.text 0x08048400:
{
*(.text)
}
}
这里有一点需要说明,在没有指定入口函数时,默认的入口函数时_start函数,原因在于链接器使用了默认的链接脚本,内部明确指明_start函数为入口函数。
可以使用 ld --verbose 可以查看默认链接脚本的内容。
新闻标题:链接器中——链接脚本
标题URL:http://ybzwz.com/article/jjohcp.html