Assembly 是否有支持用户定义重新定位的对象文件格式?
我目前正在研究一个模拟的CPU(实际上并不存在),并且没有针对这种CPU类型的工具 我们的想法是编写一个汇编器,它只输出包含Assembly 是否有支持用户定义重新定位的对象文件格式?,assembly,linker,object-files,Assembly,Linker,Object Files,我目前正在研究一个模拟的CPU(实际上并不存在),并且没有针对这种CPU类型的工具 我们的想法是编写一个汇编器,它只输出包含.byte行的“汇编”文件,这样我就可以使用“x86 binutils”工具链来创建可执行文件(my as->x86 as->ld->objcopy) 例如: input.s: instx r1, 0x12 insty r2, 0x34 instz r3, 0x5678 output.s: .byte 0xa1, 0x12 # in
.byte
行的“汇编”文件,这样我就可以使用“x86 binutils”工具链来创建可执行文件(my as
->x86 as
->ld
->objcopy
)
例如:
input.s:
instx r1, 0x12
insty r2, 0x34
instz r3, 0x5678
output.s:
.byte 0xa1, 0x12 # instx r1, 0x12
.byte 0xb2, 0x34 # insty r2, 0x34
.byte 0xc3, 0x56, 0x78 # instz r3, 0x5678
我的问题是搬迁。例如:
input.s:
instxy r4, symbol
output.s:
.byte 0xd4, (((symbol&0xF000)>>8)|((symbol&0xF0000)>>16))
。。。但“符号”是在另一个对象文件或标签中定义的符号,其地址在链接时间之前是未知的
似乎有:非标准搬迁;所以至少我不是第一个需要这个功能的人
所以我的问题是,GNUBINUTILS工具链(或一个附加的GNU工具)是否已经提供了定义“用户定义”重定位类型的简单方法
可能还有其他对象文件格式支持此功能
我已经知道如何实现一个附加工具,将此功能添加到现有的“binutils”工具链中,但我希望避免在已经实现此功能时花费时间实现一个新工具
编辑
由于似乎这样的功能还不存在,我实现了我的解决方案并在上发布了它-只是为了防止其他人需要这样的功能。如果使用ELF,您可以通过自定义重新定位来定义自己的机器类型。但是,您必须修补libbfd以支持新的体系结构。我认为不存在这种支持,尤其是在x86中。是否已有支持单独的hi/lo字节地址的体系结构?e、 g.AVR?我知道一些非x86格式支持对32位地址的高/低部分进行重定位,例如MIPS
lui$1、%hi(symbol)
/ori$1、%1、%lo(symbol)
。如果这很重要,您需要如何定制?我是否遗漏了什么,或者该表达式只是(symbol>>8)&0xFF00
,即符号的高位字节,填充字节为零。为什么要分别编写这两个半字节?@PeterCordes这两个半字节只是一个奇怪的重新定位类型的例子,其他任何CPU都不支持。我目前使用的CPU每个地址使用16位(因此sizeof(uint16)=1),对于某些指令,必须提取地址的6位……但按照您编写的方式,一个字节的两半最终都在一起,因此您编写的表达式简化为(symbol>>8)&0xFF00
,或(symbol&0xFF000)>>8
。我在问你是不是想写一些更棘手的东西,比如一个小口交换(或者如果我在简化时犯了一个错误)@PeterCordes也许我做错了什么。但我想展示一个重定位,其中值0xABCDE以0xBA结束(因此高位和低位甚至颠倒)。PowerPC VLE指令集就是已经存在这种重新定位的一个例子。