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.
Es ist ein Fehler in der Erweiterung dann? Verrückte Diagnose! –
@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. –
@ n.m. Vielleicht weißt du, warum es keine Warnung gibt? Assemble-Fehler ist nicht sehr hilfreich. (Ich bin nur neugierig). –