2010-06-02 6 views
1

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 
+3

Bien. Juste pour énoncer la question évidente. Avez-vous en fait des instances de classe statiques? –

+0

Je le fais certainement - au moins deux devraient être dans le binaire final pour ARM. –

+0

Question mise à jour avec un peu plus d'informations. –

Répondre

1

Cela a fini par être un problème de système de construction - le script de l'éditeur de liens était spécifié plusieurs fois sur la ligne de commande de l'éditeur de liens, ce qui provoquait l'étranglement de g ++.