#c #ide #gcc #cpp
Code::Blocks 8.02 Ubuntu 10.04 LTS (x86_64) Пишу Сишный код. Компилятор ругается, что нет g++, и просит установить. Установил. Заработало. Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++?
Ответы
Ответ 1
Почему IDE требует С++ компилятор для С кода? Все очень просто. В качестве линкера (компоновщика связей) используется g++: gcc -Wall -O2 -c /home/gaal/TEST/TEST/main.c -o obj/Release/main.o g++ -o bin/Release/TEST obj/Release/main.o -s Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++? См. комментарии к предыдущему ответу. Если компилятор — gcc, а линкер — g++, то просто будут добавлены зависимости от библиотек C++. Если компилятор и линкер — g++ с ключами для C-кода, то опять же будут определенные библиотеки. Но по идее код будет «Сишным».Ответ 2
В бинарник будет зашит рантайм C++, возможно, добавятся какие-нибудь дополнительные секции. Будут другие библиотечные зависимости: C: linux-vdso.so.1 => (0x00007fff6ab46000) libc.so.6 => /lib/libc.so.6 (0x00007f0eb1149000) /lib64/ld-linux-x86-64.so.2 (0x00007f0eb14f4000) C++: linux-vdso.so.1 => (0x00007fff12fff000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fe1cab00000) libm.so.6 => /lib/libm.so.6 (0x00007fe1ca87d000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe1ca666000) libc.so.6 => /lib/libc.so.6 (0x00007fe1ca2e3000) /lib64/ld-linux-x86-64.so.2 (0x00007fe1cae2e000) Вот такой код: int main(){} скомпилированный (gcc, g++) и дизассемблированный отличался только строками: // в начале main .cfi_personality 0x3,__gxx_personality_v0 ... // при выходе из main movl $0, %eax В варианте C++ обе были добавлены. Первая строка - видимо, какие-то метаданные, а вот вторую объяснить не могу, но в общем ничего существенного. Зачем-то обнуляется регистр eax.
Комментариев нет:
Отправить комментарий