J'écris du code C++ pour fonctionner dans un environnement autonome (essentiellement une carte ARM). Cela s'est bien passé, sauf que je suis tombé sur une pierre d'achoppement - les constructeurs statiques globaux. À mon sens, la section .ctors contient une liste d'adresses pour chaque constructeur statique, et mon code a simplement besoin d'itérer cette liste et de faire des appels à chaque fonction au fur et à mesure. Cependant, j'ai trouvé que cette section dans mon binaire est en fait complètement vide! Google a souligné l'utilisation de ".init_array" au lieu de ".ctors" (une chose EABI), mais cela n'a rien changé.Autoportant Code ARM C++ - vide section .ctors
Des idées sur la raison pour laquelle mes constructeurs statiques n'existent pas? script éditeur de liens pertinents et la sortie objdump suit:
.ctors :
{
. = ALIGN(4096);
start_ctors = .;
*(.init_array);
*(.ctors);
end_ctors = .;
}
.dtors :
{
. = ALIGN(4096);
start_dtors = .;
*(.fini_array);
*(.dtors);
end_dtors = .;
}
-
2 .ctors 00001000 8014c000 8014c000 00054000 2**2
CONTENTS, ALLOC, LOAD, DATA
<snip>
8014d000 g O .ctors 00000004 start_ctors
<snip>
8014d000 g O .ctors 00000004 end_ctors
J'utilise un compilateur ciblé arm-elf GCC (4.4.1).
Mise à jour: Le binaire de sortie est également plein de __static_initialization_and_destruction_0
symboles, que je n'ai jamais vu auparavant.
Mise à jour 2: Voici un extrait d'un objdump d'un fichier objet compilé (qui est lié dans le binaire principal) avec la section .ctors intacte:
21 .ctors 00000004 00000000 00000000 00000864 2**2
CONTENTS, ALLOC, LOAD, RELOC, DATA
RELOCATION RECORDS FOR [.ctors]:
OFFSET TYPE VALUE
00000000 R_ARM_ABS32 _GLOBAL__I__ZN9SomeStaticClass10m_InstanceE
Bien. Juste pour énoncer la question évidente. Avez-vous en fait des instances de classe statiques? –
Je le fais certainement - au moins deux devraient être dans le binaire final pour ARM. –
Question mise à jour avec un peu plus d'informations. –