Pourquoi GCC programme C compilé besoins .eh_frame section?

Test est sur 32 bits x86 Linux avec gcc 4.6.3

Lors de l'utilisation de gcc pour compiler un C programme et à l'aide de readelf pour vérifier la section info,
Je peux voir le .eh_frame section et .eh_frame_hdr sections à l'intérieur.

Par exemple, voici la section info de binaire programme Perlbench.

readelf -S perlbench
There are 28 section headers, starting at offset 0x102e48:
Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
[ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
[ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4
[ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000044 04   A  5   0  4
[ 5] .dynsym           DYNSYM          080481f0 0001f0 0007b0 10   A  6   1  4
[ 6] .dynstr           STRTAB          080489a0 0009a0 0003d6 00   A  0   0  1
[ 7] .gnu.version      VERSYM          08048d76 000d76 0000f6 02   A  5   0  2
[ 8] .gnu.version_r    VERNEED         08048e6c 000e6c 0000a0 00   A  6   2  4
[ 9] .rel.dyn          REL             08048f0c 000f0c 000028 08   A  5   0  4
[10] .rel.plt          REL             08048f34 000f34 000388 08   A  5  12  4
[11] .init             PROGBITS        080492bc 0012bc 00002e 00  AX  0   0  4
[12] .plt              PROGBITS        080492f0 0012f0 000720 04  AX  0   0 16
[13] .text             PROGBITS        08049a10 001a10 0cf86c 00  AX  0   0 16
[14] .fini             PROGBITS        0811927c 0d127c 00001a 00  AX  0   0  4
[15] .rodata           PROGBITS        081192a0 0d12a0 017960 00   A  0   0 32
[16] .eh_frame_hdr     PROGBITS        08130c00 0e8c00 003604 00   A  0   0  4
[17] .eh_frame         PROGBITS        08134204 0ec204 01377c 00   A  0   0  4
[18] .ctors            PROGBITS        08148f0c 0fff0c 000008 00  WA  0   0  4
[19] .dtors            PROGBITS        08148f14 0fff14 000008 00  WA  0   0  4
[20] .jcr              PROGBITS        08148f1c 0fff1c 000004 00  WA  0   0  4
[21] .dynamic          DYNAMIC         08148f20 0fff20 0000d0 08  WA  6   0  4
[22] .got              PROGBITS        08148ff0 0ffff0 000004 04  WA  0   0  4
[23] .got.plt          PROGBITS        08148ff4 0ffff4 0001d0 04  WA  0   0  4
[24] .data             PROGBITS        081491e0 1001e0 002b50 00  WA  0   0 32
[25] .bss              NOBITS          0814bd40 102d30 002b60 00  WA  0   0 32
[26] .comment          PROGBITS        00000000 102d30 00002a 01  MS  0   0  1
[27] .shstrtab         STRTAB          00000000 102d5a 0000ec 00      0   0  1

Dans ma compréhension, ces deux sections sont utilisées pour la gestion des exceptions, c'produire des tableaux qui décrivent la façon de détendre la pile.

Mais c'est pour C++ programme, ils utilisent eh_frame et gcc_exception_table sections pour gérer les exceptions, alors pourquoi ne compilateur mettre le eh_frame et eh_frame_hdr sections à l'intérieur des ELF compilées à partir de C programme?

  • x86-64 ABI mandats .eh frames partout exacte. Cela a été ajoutée pour permettre le déroulement de la pile partout où cela est nécessaire à l'échelle du système dans certains cas, comme dans des outils de profilage. GCC donc sur x86_64 par défaut HEIN cadre de la génération et de la tentative d'en faire partout exacte, alors que sur la plupart des autres ABIs la valeur par défaut HEIN cadre génération seulement lorsque EH cadre est nécessaire et il est précis uniquement dans les points de programme qui pourrait déclencher HEIN et donc de déroulement.
  • Je soupçonne gcc utilise aussi à mettre en œuvre __attribute__((cleanup(..))).
  • double possible de What de l'utilisation de l' .eh_frame section dans les programmes en C?
  • "référence à cette question?" Je ne comprends pas ce que tu veux dire. Entendez-vous les commentaires? Pourquoi les questions sont différentes? J'ai peut-être tort. La fermeture de l'inverse est une autre possibilité: c'est un peu mieux posés, donc, mais l'autre est plus, choix difficile. Sur nom d'utilisateur, le congé de discussion pour la méta ou twitter. Des acclamations.