2012-10-10 3 views
1

J'ai une fonction C comme suit:Référence indéfinie à la fonction jamais utilisée/définie/n'importe quoi?

static uint32_t initrd_read(fs_node_t *node, 
    uint32_t offset, uint32_t size, uint8_t *buffer) { 

    initrd_file_header_t header = file_headers[node->inode]; 
    if (offset > header.length) 
     return 0; 
    if (offset+size > header.length) 
     size = header.length-offset; 
    memcopy(buffer, header.offset+offset, size); 
    return size; 
} 

Quand il est relié au reste du programme, un undefined reference to 'memcpy' est jeté. memcpy n'est jamais utilisé dans le code et n'est pas défini. Le code est lié de manière autonome, il n'est donc pas en conflit avec une bibliothèque C. Pour une raison quelconque, l'éditeur de liens pense que la fonction ci-dessus appelle memcpy au début de l'appel de fonction, et je ne sais pas pourquoi.

Pourquoi cela est-il possible?

+0

Je suggère de désassembler le fichier cible et voir où 'memcpy' est appelé. – FamZheng

Répondre

3

memcpy peut être utilisée implicitement par le compilateur pour effectuer des opérations de copie "longues" (comme une affectation de structure). Par exemple, dans votre code que vous faites

initrd_file_header_t header = file_headers[node->inode]; 

qui ressemble à un bon candidat pour quelque chose qui va réellement se traduire par un appel memcpy.

Y a-t-il une raison pour laquelle vous créez une copie de cet objet initrd_file_header_t au lieu d'accéder directement à l'original? Je ne vous vois pas modifier cet objet, vous pouvez donc faire

const initrd_file_header_t *header = &file_headers[node->inode]; 

et accéder aux champs comme header->length etc. Ce sera probablement éliminer cet appel implicite à memcpy.

+0

N'a pas considéré les longues copies. Merci! (sélectionnera la réponse quand elle s'ouvrira dans 5 minutes) –

Questions connexes