2017-07-15 2 views
1

Dans un Stackoverflow Q/A différent, il y avait un post that showed how to embed arbitrary data in assembly and reference it in C++.Erreur "référence indéfinie" lors de l'utilisation de l'assemblage pour incorporer des données, en utilisant la compilation mingw-w64 pour les fenêtres (COFF au lieu de ELF)

Cela fonctionne très bien sous Linux, mais lors de la compilation pour Windows (en utilisant mingw-w64), l'assembly doit être différent car l'exécutable utilise le format COFF au lieu de ELF.

Mon assemblage actuel pour incorporation de données est la suivante (pour COFF):

# data.asm 
    .section .rodata 
    .global data_bin 
    .def data_bin; .scl 2; .type 50; .endef 
    .align 4 
data_bin: 
    .incbin "dataFile" 
data_bin_end: 
    .global data_bin_size 
    .def data_bin_size; .scl 2; .type 15; .endef 
    .align 8 
data_bin_size: 
    .quad data_bin_end - data_bin 

(je l'utilise » .scl 2" parce que la classe de stockage "2" est apparemment globale/extern, et je m en utilisant ".type 50" pour les données comme "50" est la valeur pour un tableau de caractères, et j'utilise ".type 15" pour la taille de données comme "15" est la valeur pour un long non signé (tout cela comme specified here))

J'utilise toujours le même fichier d'en-tête pour référencer les données:

// data.hpp 
#ifndef DATA_ASM_HPP 
#define DATA_ASM_HPP 

extern const char data_bin[]; 
extern const unsigned long long data_bin_size; 

#endif 

L'assemblage se compile bien, tout comme le reste du programme. Le problème se pose lors de la liaison, où l'éditeur de liens prétend que data_bin et data_bin_size sont indéfinis même si je les ai définis dans le code d'assembly (référence non définie à 'data_bin').

Des idées/solutions pour y remédier? J'ai vérifié deux fois et le fichier objet généré à partir de la compilation du code d'assemblage est inclus dans l'étape de liaison.

Répondre

0

Ajouter extern "C" { } autour data.hpp (sous Linux, les noms de variables ne sont pas mutilée, mais dans les fenêtres, ils sont)

Et peut-être, vous aurez besoin de préfixer « _ » aux noms variables dans l'asm.

+0

Wow, cela a fait l'affaire (à la fois le bloc externe et l'ajout de "_" aux noms de variables dans l'asm). Merci beaucoup! –