要对内核进行页映射,首先要知道内核在内存中的位置和内核的大小。内核在内存中的位置很好知道,因为是启动代码拷贝进去的,而内核的大小就不好知道了,只有最后将各个obj文件组合成内核文件的ld命令才知道。而ld命令的命令行参数很难定义参数告诉代码,此时就需要链接器脚本linker script了。ld使用命令-T指定链接器
linker script功能很强大,可以告诉链接器应该怎么干活儿,除了告诉链接器起始代码地址在哪里,是什么样的cpu机器类型外,最重要的是告诉链接器各个文件的各个section应该怎么组合:应该从哪个地址开始放,各个section以什么顺序放,分别怎么对齐等等,最终组成输出文件的各个section
除此之外,linker script还可以定义各种符号,放到最终生成的符号表中。符号表是一堆符号的列表,每个符号包含了符号名字,符号所引用的内存地址,以及其他一些属性信息。符号本身不占用程序的任何内存空间,实际上就是一个地址的符号表示。
在C语言中,当定义一个变量时,实际上是做了两件事:1. 定义一个符号,最终放到符号表中,为其关联一个地址;2. 为这个变量分配一块儿内存空间,可以对其进行访问。举例来说:
int a;
a = 10;
printf("%d\n", a);
int *pa = &a;
int a;定义了一个变量,首先在符号表中创建符号a,保存a对应的地址,然后在内存空间中给a预留了一个int大小的空间,空间的地址由符号表中a对应的地址指定。
第二行a=10;是为符号a所代表的地址指向的int大小的内存空间赋值为10,第三行是引用符号a所代表地址指向的int大小内存空间中的数据。
第四行&a是直接从符号表中取符号a所对应的地址的值,该值与内存中的实际数据无关,在编译链接期间就可确定(当然,本例中a是局部变量,其地址还是运行期确定的,静态变量和全局变量的地址编译器确定)。
linker script中定义的符号,只是符号表中的一个符号,其没有对应的内存空间,只是表示了一个地址值。因此,如果在linker script中如此定义了两个符号:
.text :
{
_text_begin = .;
*(.text)
_text_end = .;
}
在代码中如下访问是错误的:
extern int _begin_text, _end_text;
int a = _end_text - _begin_text;
上面引用_begin_text和_end_text的方式是采用变量的访问方式,直接访问变量所对应的内存中的值,实际上这些符号在内存中没有对应的值。如下访问是正确的:
extern int _begin_text, _end_text;
int a = &_end_text - &_begin_text;
另外,数组名字实际上就是一个符号值,可以直接拿来使用,如下访问也是正确的:
extern char _begin_text[], _end_text[];
int a = _end_text - _begin_text;
分享到:
相关推荐
Set the name of the dynamic linker. This is only meaningful when generating dynamically linked ELF executables. The default dynamic linker is normally correct; don't use this unless you know wh
MinGW编译时报错: fatal error: -fuse-linker-plugin, but liblto_plugin-0.dll not found 时缺少的一个文件,将文件下载后放在C:\MinGW\libexec\gcc\mingw32\xxx目录下(xxx是你的g++版本号)下,问题即可解决
linux链接脚本lds解析
Linker Script in Linux(链接脚本学习) Linker Script in Linux(链接脚本学习)--
可视链接器 Gnu Linker
The compiler system, featuring compiler, linker, assembler, resource Editor and a lot of useful tools
一些项目中常见的问题,方便查阅,及时的解决问题。
非常经典的一片介绍 linker script的文章
LCF-AT 是个传奇,脱壳牛人。他跟 Raham 都是研究脱壳,不研究破解的。两个都是脱壳牛人。VMProtect 1.xx - 2.xx自动脱壳机(脚本)+教程(密码tuts4you)
sanity install @nacelle/sanity-plugin-pim-linker 证书 您需要提供与机舱空间关联的ID和令牌。 这些凭据可以在“找到。 您可以通过以下两种方式之一添加这些凭据: 在./config/@nacelle/sanity-plugin-pim-...
Linker+Script+in+Linux Linker+Script+in+Linux Linker+Script+in+Linux Linker+Script+in+Linux Linker+Script+in+Linux Linker+Script+in+Linux
arm-linux-gnueabihf编译链 实测可用,例如德克萨斯的OK系列,如果有问题欢迎在下面留言
bash_shell matrix_computations llvm_cook loader_linker sparse_matrix block_Jacobi_svd regular_expression
今天编写一个简单的代码,报错了: template class matrix final { public: matrix(uint32_t size): SIZE(size) { _data = static_cast(malloc(SIZE * sizeof(T*))); for (uint32_t i = 0;...
Microsoft (R) Incremental Linker Version 7.00.9210 Copyright (C) Microsoft Corporation. All rights reserved. -MERGE:_PAGE=PAGE -MERGE:_TEXT=.text -SECTION:INIT,d -OPT:REF -OPT:ICF -IGNORE:4010,...
-链接- /MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB /MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib /ML 与 LIBC.LIB 链接 link with.../link [链接器选项和库] [linker options and libraries]
保存游戏链接器将实际的保存游戏移动到指定的文件夹,并符号链接目标。... save-game-linker --home-dir ~ / --conf ~ /Dropbox/Saves/paths-linux.yml --save-dir ~ /Dropbox/Savessave-game-linker --help
npm i -g package-linker 用法: 当同时使用多个相互依赖的程序包时,在同一级别检出所有存储库,然后根据需要使用“ npm link”命令将它们链接起来很有用。 该实用程序从配置文件中读取要相互链接的软件包,从...
适用于BK7231T的Tuya IoTOS嵌入式Wi-Fi和BLE SDK|概述Tuya IoTOS由Tuya Smart独立开发,是全球唯一的IoT操作系统,涵盖所有级别的IoT传感,中断,网络,平台和应用程序。 受益于Tuya Smart在物联网行业的积累,...