我正在设计一个risc-v处理器,并使用gcc编写一些测试程序。
我在elf文件中看到这些符号,它们似乎并不是程序执行所真正需要的,但我似乎无法将它们剥离。
下面是我的简单程序:
// file: loop_c.c
int a = 0;
void _start() {
for (int i = 0; i < 10; ++i) {
a += 20;
}
}
我把它编译成elf如下:
riscv32-unknown-elf-gcc -static -nostdlib -T riscv32i.ld loop_c.c -o loop_c.elf
当我查看loop_c.elf的十六进制内容时,我看到以下位似乎无法删除:
strip
删除了其中的一些,但不是全部。我使用了以下命令:
riscv32-unknown-elf-strip --strip-unneeded loop_c.elf
有没有办法完全删除这些位,并将其设置为0?
编辑:编译器版本:
riscv32-unknown-elf-gcc (GCC) 11.1.0
编辑2:上图中突出显示的部件有名称吗?
编辑3:好了,取得了一些进展。strip
不会自动删除的部分的名称是(在上面的第二张图片中):
.shstrtab
.riscv.attributes
.sbss
我可以用下面的命令删除第二个和第三个:
riscv32-unknown-elf-strip -R .riscv.attributes loop_c.elf
riscv32-unknown-elf-strip -R .sbss loop_c.elf
但在网上搜索,似乎很难或不可能删除.shstrtab
。我不知道为什么,但似乎出于某种原因,这是必要的。
编辑4:我的链接器脚本。这是我的CPU设计的非常基本的部分。显然没有什么接近于真实的世界中使用的:
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
ENTRY(_start)
MEMORY
{
INST (rx) : ORIGIN = 0x1000, LENGTH = 0x1000 /* 4096 bytes or 1024 instructions max, 1 instruction = 4 bytes. */
DATA (rwx) : ORIGIN = 0x2000, LENGTH = 0x1000 /* 4096 bytes or 1024 words of data. 1 word = 4 bytes. */
}
SECTIONS
{
.text :
{
*(.text)
}> INST
.data :
{
*(.data)
}> DATA
}
1条答案
按热度按时间b1zrtrql1#
我设法摆脱了一个简单程序的**.riscv.attribute**部分,该程序包含一个文本和一个bss部分,该部分 * 必须 * 是连续的,并且不能容忍干扰部分。(原因是稍后我想保存一个修改后的程序,这是一个解释器/编译器系统)。
像往常一样,AS 和 LD 指向一个riscv gnu汇编器和一个gnu链接器。在这个例子中,-N 选项将部分放在一起,并调用bss段中的可执行代码。你可能不需要这个。程序包含一个汇编器,代码被放置在bss段中,并且可以立即执行,而无需离开解释器。
[It令人愤怒的是,地带拒绝消除这显然是多余的部分。我会说,它没有业务拒绝,即使我想剥离的文本部分。]