2011-12-13 19 views
5

Quando si compila il file contenente open("FILENAME", O_RDONLY); senza il flag -O2, tutto va bene. Ma quando -O2 è acceso ottengo:gcc -O2 vs. senza cause errore

/usr/include/x86_64-linux-gnu/bits/fcntl2.h: In function ‘open’: 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:44:7: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:45:26: error: call to ‘__open_too_many_args’ declared with attribute error: open can be called either with 2 or 3 arguments, not more 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:42:1: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:60:3: error: invalid use of ‘__builtin_va_arg_pack()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h: In function ‘open64’: 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:76:7: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:77:28: error: call to ‘__open64_too_many_args’ declared with attribute error: open64 can be called either with 2 or 3 arguments, not more 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:74:1: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:92:3: error: invalid use of ‘__builtin_va_arg_pack()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h: In function ‘openat’: 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:120:7: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:121:28: error: call to ‘__openat_too_many_args’ declared with attribute error: openat can be called either with 3 or 4 arguments, not more 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:118:1: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:136:3: error: invalid use of ‘__builtin_va_arg_pack()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h: In function ‘openat64’: 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:154:7: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:155:30: error: call to ‘__openat64_too_many_args’ declared with attribute error: openat64 can be called either with 3 or 4 arguments, not more 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:152:1: error: invalid use of ‘__builtin_va_arg_pack_len()’ 
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:170:3: error: invalid use of ‘__builtin_va_arg_pack()’ 

Dove può essere il problema? È un progetto misto C/C++ ma questo è nella parte C. gcc 4.6.1, il kernel 3.0.0

Edit: Si scopre che commeting fuori coloro linea dà un altro "tipo" di errori come:

/usr/include/x86_64-linux-gnu/bits/stdio2.h: In function ‘sprintf’: 
/usr/include/x86_64-linux-gnu/bits/stdio2.h:34:3: error: invalid use of ‘__builtin_va_arg_pack()’ 
+6

Qualche possibilità di fornire un esempio di codice minimo ma completo che faccia scattare questo errore? – luiscubal

+0

Strano, sei sicuro che provenga da questa linea? Includete tutto il necessario? (per open e O_RDONLY) – BenjaminB

+0

Quindi chiami 'g ++' o 'gcc'? – 0xC0000022L

risposta

2

Provare a compilare con -fno-builtins. Se questo risolve il problema, hai ovviamente qualche problema, ma probabilmente non è nella tua fonte.

2

avrei semplicemente scaricare un diverso (un po ' ? vecchio) compilazione del kernel:

Ecco una segnalazione di bug, per quel che vale la pena:

https://bugs.archlinux.org/task/27100

E no, non ho alcuna idea del perché "-O2" avrebbe nulla a che fare con questo particolare errore ...

APPENDICE: Questo link potrebbe dare ulteriori spiegazioni sul messaggio di errore stesso. Ma ancora una volta - Io suggerirei di provare un diverso compilazione del kernel come il primo passo:

http://gcc.gnu.org/ml/gcc-patches/2007-09/msg00675.html

+0

O2 causa errori perché durante l'ottimizzazione, il compilatore utilizza tali funzioni incorporate. Quando non sta ottimizzando, sta usando le funzioni di libreria. –

+0

In genere, parte del codice che rileva errori appartiene a vari passaggi di ottimizzazione. Quindi il compilatore rileva questi errori solo quando questi passaggi sono abilitati. – janneb

1

Se si desidera ignorare questo errore, prendere in considerazione la rimozione del flag -Wp,-D_FORTIFY_SOURCE=2. Per esempio, se si utilizza rpmbuild, questo flag è introdotta da RPM_OPT_FLAGS

%build 
export CFLAGS="$RPM_OPT_FLAGS" 
export CXXFLAGS="$RPM_OPT_FLAGS" 
./configure … 

Ecco un modo semplice per tenere tutto, ma la bandiera citato

OPT_FLAGS=`echo $RPM_OPT_FLAGS | sed 's/-Wp,-D_FORTIFY_SOURCE=2 //'` 
export CFLAGS="$OPT_FLAGS" 
export CXXFLAGS="$OPT_FLAGS" 
1

mi ha colpito questo quando si cerca di compilare https://www.spec.org/cpu2017/Docs/benchmarks/602.gcc_s.html con GCC.

Ironia della sorte, il processo di boot non sarebbe riuscito a causa di GCC che apparentemente non capiva le estensioni GNU.

Accensione -fgnu89-inline eliminato tutti i problemi che stavo avendo. In alternativa, utilizzare -std=gnu89.