Can't strip away attributes and some symbols from elf

Viewed 160

I am designing a risc-v processor and am using gcc to write some test programs for it.

I see these symbols in the elf file which don't seem to be really needed for the program execution, but I can't seem to be able to strip them away.

Here is my simple program:

// file: loop_c.c
int a = 0;

void _start() {
  for (int i = 0; i < 10; ++i) {
    a += 20;
  }
}

I am compiling this into elf as follows:

riscv32-unknown-elf-gcc -static -nostdlib -T riscv32i.ld loop_c.c -o loop_c.elf

When I look into the hex contents of loop_c.elf, I see the following bits which I can't seem to be able to remove:

enter image description here

strip removes a few of them, but not all. I used the following command:

riscv32-unknown-elf-strip --strip-unneeded loop_c.elf

enter image description here

Is there any way to remove these bits completely and just set them to 0?

EDIT: Compiler version:

riscv32-unknown-elf-gcc (GCC) 11.1.0                                          

EDIT2: Is there a name for the parts highlighted in the image above?

EDIT3: Okay, made some progress. The names of the sections that strip doesn't remove automatically are (in the second image above):

  1. .shstrtab
  2. .riscv.attributes
  3. .sbss

I could remove the second and third ones with the following command:

riscv32-unknown-elf-strip -R .riscv.attributes loop_c.elf
riscv32-unknown-elf-strip -R .sbss loop_c.elf

But searching online, it seems that it's very hard or impossible to remove .shstrtab. I'm not sure why, but it seems that it's necessary for some reason.

EDIT4: My linker script. This is very bare bones for my CPU design. Obviously nothing close to what is used in the real world:

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

}
0 Answers
Related