Есть ли простой способ сделать gcc опустить crtbegin.o/crtend.o?

Помимо использования -nostdlib и связывания crt1.o -lc -lgcc самостоятельно, существует ли какой-либо простой способ предотвратить gcc от ссылки crtbegin[S].o и crtend[S].o? Эти файлы не такие большие, но я играю с созданием небольших двоичных файлов и хотел бы удалить бесполезный код поддержки С++, который не нужен для программ на C. (Предположительно, gcc связывает их даже для программ на C, если вы используете библиотеку С++ с глобальными переменными объектов. Я пожалею всех о том, как он должен генерировать безопасные одноразовые вызовы инициализации везде, на которые ссылается глобальный объект в С++ вместо инициализации глобальных объектов до main...)

Я не возражаю против взлома файла gcc specs, чтобы сделать привязку файлов поддержки С++ условной к такому-то, но я не уверен, как это сделать. Возможно, там уже хороший способ?

Ответ 1

gcc -wrapper sh,-c,'z= ; for i ; do [ "$z" ] || set -- ; z=1 ;
    case "$i" in *crtbegin*.o|*crtend*.o) ;; *) set -- "[email protected]" "$i" ;; esac ;
    done ; exec "$0" "[email protected]"'

Ответ 2

Мне кажется, вам нужен параметр -nostartfiles. Это то, что мне нужно для встроенных вещей в любом случае.