2017-03-20 3 views
0

Ich habe ein merkwürdiges Problem. Ich kann meinen Code für arm kompilieren aber kann nicht für x86 mit gcc v 6.3 (und andere auch). Hier ist ein Beispielcode, der Probleme verursacht.Kann Code für x86 nicht kompilieren, aber kann für Arm

#include <stdint.h> 
#include <cstdio> 
#include <unistd.h> 
#include <csignal> 

volatile bool $run = true; 

static void quitHandler(int __attribute__((unused)) signum) 
{ 
    $run = false; 
} 

void setupQuitHandler() 
{ 
    struct sigaction action; 
    action.sa_handler = quitHandler; 
    action.sa_flags = SA_RESETHAND; 

    if (sigemptyset(&action.sa_mask) < 0) printf("[SetupQuit] sigemptyset"); 

    if (sigaction(SIGINT, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGINT"); 
    if (sigaction(SIGQUIT, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGQUIT"); 
    if (sigaction(SIGTERM, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGTERM"); 
    if (sigaction(SIGABRT, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGABRT"); 
} 

int main(int argc, char **argv) { 

    setupQuitHandler(); 
    while($run) 
    { 
     sleep(1); 
     printf("Do nothing! \n"); 
    } 
} 

Hier ist ein online example mit gcc

Diese Ursache montieren Fehler:

Building file: ../main.cpp 
Invoking: Cross G++ Compiler 
g++ -O0 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.cpp" 
/tmp/ccEUYGVm.s: Assembler messages: 
/tmp/ccEUYGVm.s:19: Error: junk `(%rip)' after expression 
/tmp/ccEUYGVm.s:19: Error: unsupported instruction `mov' 
/tmp/ccEUYGVm.s:137: Error: junk `(%rip)' after expression 
/tmp/ccEUYGVm.s:137: Error: operand type mismatch for `movzb' 
make: *** [subdir.mk:26: main.o] Błąd 1 

Was seltsam ist, ich es mit Klappern zusammenstellen können. Hier online example

Ich habe versucht, gcc-Versionen 4.8, 5.x, 6.3 (x- Ich erinnere mich nicht) mit -O0-O2 und -03 Parameter.

Wenn ich #include <csignals> auch versucht (<signal.h>) und alle abhängigen entfernen, gibt es kein Problem. Aber es ist schön, das "INT" -Signal zu empfangen.

Antwort

5

$ ist kein gültiges Bezeichnerzeichen. Es ist eine gcc-Erweiterung, die mit jeder möglichen Header-Datei funktionieren kann oder auch nicht. Verwenden Sie nicht $ und der Fehler verschwindet.

+0

Es ist ein Fehler in der Erweiterung dann? Verrückte Diagnose! –

+0

@BoundaryImposition GCC behandelt es ziemlich gut und übergibt das Ergebnis an den Assembler. Nun passiert es, dass $ mit verschiedenen Assemblern eine andere Bedeutung hat. Ich weiß nicht, ob es einen Weg gibt, '$' zu entkommen, den die Binutils verstehen würden. Um es auf x86 "arbeiten" zu lassen, könnte gcc auch den Variablennamen verändern, aber das scheint nicht so nützlich zu sein. –

+0

@ n.m. Vielleicht weißt du, warum es keine Warnung gibt? Assemble-Fehler ist nicht sehr hilfreich. (Ich bin nur neugierig). –

Verwandte Themen