2016-01-09 1 views
0

J'essaie de compiler Linux 2.4.0 sur Ubuntu 15.10 32 bits. Je reçois ces erreurs lors de la construction:Erreur d'assemblage en ligne lors de la compilation du noyau Linux 2.4.0

linux/include/asm/checksum.h: 161: 2: erreur: manquant terminaison "caractère linux/include/asm/checksum.h: 173: 3: erreur: manquant se terminant "caractère ...

Qu'est-ce que gcc se plaint sont les citations dans l'assemblage en ligne:

static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr, 
                struct in6_addr *daddr, 
                __u32 len, 
                unsigned short proto, 
                unsigned int sum) 
{ 
     __asm__(" 
       addl 0(%1), %0 //line 162 
       adcl 4(%1), %0 
       adcl 8(%1), %0 
       adcl 12(%1), %0 
       adcl 0(%2), %0 
       adcl 4(%2), %0 
       adcl 8(%2), %0 
       adcl 12(%2), %0 
       adcl %3, %0 
       adcl %4, %0 
       adcl $0, %0 
       "     // line 173 
       : "=&r" (sum) 
       : "r" (saddr), "r" (daddr), 
        "r"(htonl(len)), "r"(htonl(proto)), "0"(sum)); 

     return csum_fold(sum); 
} 

Je ne sais pas pourquoi cela se produit. Est-ce parce que la version gcc est incompatible? Ma version gcc actuelle est gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010.

+0

pourrait Veuillez indiquer quelles sont les lignes 161 et 173? Et pourquoi avez-vous l'implémentation de code dans un fichier d'en-tête? –

+0

N'êtes-vous pas censé avoir des guillemets d'ouverture et de fermeture autour de chaque instruction? C'est à dire. "" addl 0 (% 1),% 0 \ n \ t "', etc. – Michael

+0

@WeatherVane Ajout d'un commentaire sur le numéro de ligne. C'est le code source du noyau Linux 2.4.0 pas ce que j'ai écrit. Comme c'est une fonction en ligne, je pense qu'il est normal d'être dans un fichier d'en-tête. – darklord

Répondre

2

Les littéraux de chaînes multilignes ne sont pas supportés par gcc récent. Récent (2.4.0 est ancienne!) Versions du noyau ont:

asm("addl 0(%1), %0  ;\n" 
     "adcl 4(%1), %0  ;\n" 

etc. utilisés pour être pris en charge, par exemple dans version 3.2, mais le soutien a été enlevé dans 3.3:

The preprocessor no longer accepts multi-line string literals. They were deprecated in 3.0, 3.1, and 3.2.