Первое, что поразило меня, это «почему вы используете расширение C (с заглавной буквы) для файла. c, оно зарезервировано для C ++?». Итак, я сделал тест:
# with `-fno-rtti'
$ export CFLAGS1="-m32 -fno-pie -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-rtti -fno-stack-protector -fleading-underscore -fno-asynchronous-unwind-tables"
# without `-fno-rtti'
$ export CFLAGS2="-m32 -fno-pie -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-stack-protector -fleading-underscore -fno-asynchronous-unwind-tables"
$ mv kernel.C kernel1.C
$ cp kernel.C kernel2.c
$ gcc $CFLAGS1 -c -o kernel1.C.o kernel1.C
$ gcc $CFLAGS1 -c -o kernel2.c.o kernel2.c
cc1: warning: command line option '-fno-rtti' is valid for C++/ObjC++ but not for C
$ gcc $CFLAGS2 -c -o kernel2.c.o kernel2.c
Так что держу пари, если вы декапитализируете свои расширения из .C
в .c
и .H
в .h
, вы получите лучшие результаты. G CC суетлив в этом отношении. Если вы хотите C код, используйте g cc и .c
расширение, если вы хотите C ++, используйте g ++ и .C
или .cc
или .cpp
или .cxx
.
Также я думаю, что вы должны использовать gcc
вместо ld
в качестве команды ссылки. Ld обычно "тупой" и gcc
знает лучше.
PS. Дайте мне знать, какой из них / не прав. Если не так, я уберу ответ, чтобы не запутать аудиторию.