LLVM (цель arm-none-eabi) создает раздел ARM.exidx для кода на основе C (?)

При компиляции простого HelloWorld.c с использованием Clang / LLVM (цель arm-none-eabi) создается раздел перемещения '.rel.ARM.exidx', но при использовании arm-gcc этого не происходит. Эти записи таблицы очистки, созданные LLVM, правильно помечены как canunwind. Но почему они вообще производятся, поскольку они не нужны и вызывают раздувание, поскольку вы получаете запись для каждой функции C в вашем AXF?

readelf edxidx from HelloWorld.o 
Relocation section '.rel.ARM.exidx' at offset 0x580 contains 2 entries:
Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000b2a R_ARM_PREL31      00000000   .text
00000008  00000b2a R_ARM_PREL31      00000000   .text
Unwind table index '.ARM.exidx' at offset 0xcc contains 2 entries:
0x0 <print_uart0>: 0x1 [cantunwind]
0x54 <c_entry>: 0x1 [cantunwind]

При тестировании значений по умолчанию для Clang: если я передаю Clang "-funwind-tables" для принудительной раскрутки даже для функций C, я получаю то, что ожидал, если бы писал функции .cpp и "-fno-unwind-tables" приводили к тем же результатам. как указано выше.

Relocation section '.rel.ARM.exidx' at offset 0x5a4 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000b2a R_ARM_PREL31      00000000   .text
00000000  00001600 R_ARM_NONE        00000000   __aeabi_unwind_cpp_pr0
00000008  00000b2a R_ARM_PREL31      00000000   .text
00000008  00001600 R_ARM_NONE        00000000   __aeabi_unwind_cpp_pr0
Unwind table index '.ARM.exidx' at offset 0xcc contains 2 entries:
0x0 <print_uart0>: 0x8001b0b0
  Compact model index: 0
  0x01      vsp = vsp + 8
  0xb0      finish
  0xb0      finish
0x54 <c_entry>: 0x809b8480
  Compact model index: 0
  0x9b      vsp = r11
  0x84 0x80 pop {r11, r14}

1) Есть ли способ отключить раздел .ARM.exidx при использовании только функций C, поскольку они всегда будут помечены как "cantunwind".

2) Как-нибудь убрать этот раздел при линковке? (gc-section, конечно, не будет работать, поскольку эти записи в таблице ссылаются на используемые функции)

3) Почему arm-gcc не создает этот раздел (ну, он создает, если вы используете новую библиотеку, нано и т. Д., Но я не использую и не связываю стандартные библиотеки)


person Community    schedule 23.02.2014    source источник
comment
Я бы тоже хотел раздавить эту - щедро!   -  person Carl Norum    schedule 10.06.2014
comment
Здесь как сверчки ...   -  person Carl Norum    schedule 13.06.2014


Ответы (1)


Я отвечу (2), раз так и сделал. Добавьте в свой компоновщик скрипт:

/DISCARD/ :
{
    *(.ARM.exidx)
}
person Carl Norum    schedule 10.06.2014
comment
Было бы здорово подавить это с помощью -fno-exceptions - person Alister Lee; 18.11.2015