Quantas seções posso criar no arquivo de objeto?

2

Estou seguindo o curso de Baking Pi - Desenvolvimento de sistemas operacionais . Nela eles criaram outra seção .init .

Então, podemos criar quantas seções quisermos (não apenas .data, .bss, .text ) e podemos colocar código e dados (inicializados como não) em qualquer um deles?

Se sim, qual é o propósito das seções?

    
por Makhlouf GHARBI 04.06.2014 / 09:53

2 respostas

4

Pesquisa inicial

À primeira vista, parece que a resposta seria "não". A especificação para o ELF permite apenas as seguintes seções.

C32/kernel/bin/.process.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000333  00000000  00000000  00000040  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000050  00000000  00000000  00000380  2**5
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  000003d0  2**2
                  ALLOC
  3 .note         00000014  00000000  00000000  000003d0  2**0
                  CONTENTS, READONLY
  4 .stab         000020e8  00000000  00000000  000003e4  2**2
                  CONTENTS, RELOC, READONLY, DEBUGGING
  5 .stabstr      00008f17  00000000  00000000  000024cc  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .rodata       000001e4  00000000  00000000  0000b400  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .comment      00000023  00000000  00000000  0000b5e4  2**0
                  CONTENTS, READONLY

Fonte: link

Outras fontes, como a Wikipedia, também mostram apenas os nomes das seções mais básicas, levando você a acreditar que tudo isso é permitido. Pesquisas adicionais mostraram que existem essas duas seções também:

.fini

This section holds executable instructions that contribute to the process termination code. That is, when a program exits normally, the system arranges to execute the code in this section.

.init

This section holds executable instructions that contribute to the process initialization code. That is, when a program starts to run the system arranges to execute the code in this section before the main program entry point (called main in C programs).

The .init and .fini sections have a special purpose. If a function is placed in the .init section, the system will execute it before the main function. Also the functions placed in the .fini section will be executed by the system after the main function returns. This feature is utilized by compilers to implement global constructors and destructors in C++.

Fonte: link

Mas, sim, você pode ter seções

Mas, graças a @Crogrammer por indicar-me o verdadeiro Especificação ELF v1.2 , há um parágrafo na página 1-16 que afirma o seguinte:

Section names with a dot (.) prefix are reserved for the system, although applications may use these sections if their existing meanings are satisfactory. Applications may use names without the prefix to avoid conflicts with system sections. The object file format lets one define sections not in the list above. An object file may have more than one section with the same name.

Portanto, parece que depende do programa quais seções ele deseja utilizar.

    
por 04.06.2014 / 14:30
3

O que é permitido como nomes de seção e seção dependem do formato do arquivo. Para a ELF, a definição do formato define vários deles e sua finalidade e, em seguida, diz:

Section names with a dot (.) prefix are reserved for the system, although applications may use these sections if their existing meanings are satisfactory. Applications may use names without the prefix to avoid conflicts with system sections. The object file format lets one define sections not in the list above. An object file may have more than one section with the same name.

Então, sim, você pode criar seções com qualquer nome que quiser, a forma como o sistema as manipulará é determinada por seus tipos e atributos.

    
por 04.06.2014 / 15:21