温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

链接器中——链接脚本

发布时间:2020-08-15 15:01:07 来源:网络 阅读:2992 作者:三九感冒灵 栏目:系统运维

链接脚本

链接器根据说明具体的原则完成具体的工作?
答案是:链接脚本。

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 可以查看默认链接脚本的内容。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI