2011-12-13 4 views
5

При компиляции файла, содержащего open("FILENAME", O_RDONLY); без -O2, флаг все в порядке. Но когда -O2 включен я получаю:gcc -O2 vs. without вызывает ошибку

/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()’ 

Где может быть проблема? Это смешанный проект C/C++, но это часть C. GCC 4.6.1, ядро ​​3.0.0

Edit: Оказывается, что commeting из тех линии дает еще один «тип» ошибки как:

/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

Вы можете предоставить минимальный, но полный пример кода, который вызывает эту ошибку? – luiscubal

+0

Странно, вы уверены, что это исходит из этой строки? Вы включаете все необходимое? (для open и O_RDONLY) – BenjaminB

+0

Так вы называете 'g ++' или 'gcc'? – 0xC0000022L

ответ

2

Попробуйте скомпилировать с -fno-builtins. Если это исправляет это, то у вас, очевидно, есть какая-то проблема, но это, вероятно, не в вашем источнике.

2

Я просто загрузить другой (чуть ? старше) ядро ​​сборки:

Вот сообщение об ошибке, за то, что он стоит:

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

И нет, у меня нет идея, почему «-O2» будет иметь ничего общего с этой конкретной ошибки ...

ДОПОЛНЕНИЕ: Эта ссылка может дать вам больше объяснений о самом сообщении об ошибке. Но опять-таки - я предлагаю попробовать другую сборку ядра в качестве первого шага:

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

+0

O2 вызывает ошибки, потому что при оптимизации компилятор использует эти встроенные функции. Когда он не оптимизирован, он использует библиотечные функции. –

+0

Как правило, некоторые из кодов, которые обнаруживают ошибки, относятся к различным проходам оптимизации. Следовательно, компилятор обнаруживает эти ошибки только тогда, когда эти проходы включены. – janneb

1

Если вы хотите игнорировать эту ошибку, рассмотрите возможность удаления флага -Wp,-D_FORTIFY_SOURCE=2. Например, если вы используете rpmbuild, этот флаг вводится RPM_OPT_FLAGS

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

Вот простой способ сохранить все, кроме упомянутого флага

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

Я ударил этого при попытке компиляции https://www.spec.org/cpu2017/Docs/benchmarks/602.gcc_s.html с GCC.

По иронии судьбы, процесс начальной загрузки завершился неудачно из-за того, что GCC явно не понимал расширения GNU.

Включение -fgnu89-inline избавилось от любых проблем, которые у меня были. В качестве альтернативы используйте -std=gnu89.

Смежные вопросы