[英]How to place code to a specific address using gas?
我使用 IDA Pro 反汇编了一个运行在摩托罗拉 68K CPU 上的现有软件。 IDA的output是一个遵循MRI符号的反汇编。 我对其进行了分析,发现它由五个独立的部分组成:
memory的拆解布局大致如下图。 您将在各部分之间找到的“填充”部分用 0xFF 填充,IDA 将它们转换为常量。
现在,我的任务是添加自定义代码。 因为我需要把它放在某个地方,所以我决定使用 Application SW(从 0x31600 开始)之后的“填充”部分。 由于这增加了整体大小,我只是删除了相应数量的常量 0xFF 以进行补偿。
这第一次运行良好,但很快就会变得烦人:每次我调整自定义代码时,我都需要相应地跟踪常量的数量。
为了找到一个方便的解决方案,我的想法是去掉“填充”部分。 也就是说,我会明确地将我的五个加一个部分(Bootloader SW、Application SW,...)中的每一个手动分配到其指定地址。 使用 MRI 汇编程序,可以执行以下操作:
.org 0x00000
<Default Vectors>
.org 0x00100
<Bootloader SW>
.org 0x10000
<Application SW>
.org 0x31600
<My new custom code>
.org 0x60000
<Constants>
.org 0x69300
<Test Routines>
不幸的是,出于某种原因,我不使用 MRI 汇编器,而是使用 GNU m68k-elf-as。 但是m68k-elf-as不支持使用.org
指令!
因此,我没有使用.org
指令,而是尝试使用.section
指令:
.section MyVectors, "r"
<Default Vectors>
.section MyBootloader, "x"
<Bootloader SW>
...
然后我试图让 linker 知道 linker 脚本中的这些部分:
MEMORY
{
ROM(rx) : ORIGIN = 0x00000, LENGTH = 512K
}
SECTIONS
{
.MyVectors :
{
KEEP(*(.MyVectors))
} > ROM = 0xFF
.MyBootloader :
...
}
不幸的是,以上不能正常工作。 尽管我很努力,但 linker 将我的所有部分并排放置,中间没有任何“填充”。
我该如何解决我的问题?
在 linker 脚本中,您可以为每个命名部分分配一个起始地址。 使用“.=”语法来做到这一点,有效地手动设置位置计数器:
MEMORY
{
ROM(rx) : ORIGIN = 0x00000, LENGTH = 512K
}
SECTIONS
{
. = 0
.MyVectors :
{
KEEP(*(.MyVectors))
} > ROM = 0xFF
. = 0x100
.MyBootloader :
. = 0x10000
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.