C语言 无法从精灵中剥离属性和一些符号

zpqajqem  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在设计一个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不会自动删除的部分的名称是(在上面的第二张图片中):

  1. .shstrtab
  2. .riscv.attributes
  3. .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

}
b1zrtrql

b1zrtrql1#

我设法摆脱了一个简单程序的**.riscv.attribute**部分,该程序包含一个文本和一个bss部分,该部分 * 必须 * 是连续的,并且不能容忍干扰部分。(原因是稍后我想保存一个修改后的程序,这是一个解释器/编译器系统)。

$(AS) lina.s -o  lina.o -mno-arch-attr

$(LD) -o lina  lina.o   -N

像往常一样,ASLD 指向一个riscv gnu汇编器和一个gnu链接器。在这个例子中,-N 选项将部分放在一起,并调用bss段中的可执行代码。你可能不需要这个。程序包含一个汇编器,代码被放置在bss段中,并且可以立即执行,而无需离开解释器。

  • objdump -h ciriscv.lina64* 的结果如下:
ciriscv.lina64:     file format elf64-littleriscv

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000df48  0000000000010078  0000000000010078  00000078  2**3
                  CONTENTS, ALLOC, LOAD, CODE
  1 .bss          001b20b8  000000000001dfc0  000000000001dfc0  0000dfc0  2**0
                  ALLOC

[It令人愤怒的是,地带拒绝消除这显然是多余的部分。我会说,它没有业务拒绝,即使我想剥离的文本部分。]

相关问题