2012-06-27 11 views
1

Je voudrais écraser la fonction (gestionnaires d'interruption) avec l'attribut faible, mais l'éditeur de liens ne lie pas ma définition. Les codes sont raccourcis pour une meilleure lecture.La fonction avec un attribut faible ne peut pas être écrasée

vectors.c

void NMI_Handler (void) __attribute__((weak)); 
void HardFault_Handler (void) __attribute__((weak)); 

__attribute__ ((section(".vectors"), used)) 
void (* const gVectors[])(void) = 
{ 
     NMI_Handler, 
     HardFault_Handler 
}; 

void NMI_Handler (void) { while(1); } 
void HardFault_Handler (void) { while(1); } 

Je redéfinis définition par défaut dans le fichier cpuexcept.cpp

extern "C" __attribute__((naked)) 
void NMI_Handler() 
{ 
    EXCEPT_ENTRY(CPUExcept); 
} 

extern "C" __attribute__((naked)) 
void HardFault_Handler() 
{ 
    EXCEPT_ENTRY(CPUExcept); 
} 

Si je compile et de vidage, est sortie (bib.a bibliothèque):

cpuexcept.oo:  file format elf32-littlearm 
rw-rw-rw- 0/0 4728 Jun 26 16:20 2012 cpuexcept.oo 
architecture: arm, flags 0x00000011: 
HAS_RELOC, HAS_SYMS 
start address 0x00000000 
private flags = 5000000: [Version5 EABI] 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn Flags 
    0 .text   0000051c 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000550 2**0 CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000550 2**0 ALLOC 
    3 .rodata  000001dc 00000000 00000000 00000550 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 
    4 .comment  00000012 00000000 00000000 0000072c 2**0 CONTENTS, READONLY 
    5 .ARM.attributes 00000031 00000000 00000000 0000073e 2**0 CONTENTS, READONLY 
SYMBOL TABLE: 
00000000 l df *ABS* 00000000 cpuexcept.cpp 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
000004e0 g  F .text 0000000a NMI_Handler 
000004ec g  F .text 0000000a HardFault_Handler 

000004e0 <NMI_Handler>: 
4e0: e92d 0ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp} 
4e4: 4668  mov r0, sp 
4e6: f7ff fffe bl c0 <CPUExcept> 4e6: R_ARM_THM_CALL CPUExcept 
4ea: bf00  nop 

000004ec <HardFault_Handler>: 
4ec: e92d 0ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp} 
4f0: 4668  mov r0, sp 
4f2: f7ff fffe bl c0 <CPUExcept> 4f2: R_ARM_THM_CALL CPUExcept 
4f6: bf00  nop 

vectors.o:  file format elf32-littlearm 
rw-rw-rw- 0/0 4464 Jun 27 13:52 2012 vectors.o 
architecture: arm, flags 0x00000011: 
HAS_RELOC, HAS_SYMS 
start address 0x00000000 
private flags = 5000000: [Version5 EABI] 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn Flags 
    0 .text   00000114 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000148 2**0 CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000148 2**0 ALLOC 
    3 .vectors  00000130 00000000 00000000 00000148 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA 
    4 .comment  00000012 00000000 00000000 00000278 2**0 CONTENTS, READONLY 
    5 .ARM.attributes 00000031 00000000 00000000 0000028a 2**0 CONTENTS, READONLY 
SYMBOL TABLE: 
00000000 l df *ABS* 00000000 vectors.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .vectors 00000000 .vectors 
00000000 l d .comment 00000000 .comment 
00000000 l d .ARM.attributes 00000000 .ARM.attributes 
00000000 w F .text 00000002 NMI_Handler 
00000004 w F .text 00000002 HardFault_Handler 

00000000 <NMI_Handler>: 
0: e7fe  b.n 0 <NMI_Handler> 
2: bf00  nop 

00000004 <HardFault_Handler>: 
4: e7fe  b.n 4 <HardFault_Handler> 
6: bf00  nop 

La fonction par défaut avec l'attribut faible est liée à l'application cible. Ma définition est liée correcte, si je définis la fonction f() dans cpuexcept.cpp et je l'utilise dans la fonction principale ou si ma définition de handler est dans un autre module .c. J'utilise le compilateur bras-aucun-eabi-gcc 4.6.2 (YAGARTO) dans cygwin.

Répondre

0

Vous pouvez essayer de définir votre fonction comme
void NMI_Handler(void)
et non comme
void NMI_Handler()

Comme la définition faible est également void NMI_Handler (void) __attribute__((weak));
Donc, l'éditeur de liens ne voir aucune différence.

+0

Merci pour votre conseil. Je l'ai essayé, mais ce n'est pas juste. – ehiker

Questions connexes