powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как я люблю gcc
66 сообщений из 66, показаны все 3 страниц
Как я люблю gcc
    #39321055
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По просьбам зрителей, да и что то у меня накопилось.

Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет.

///1
Пример первый - есть структурка - в которой перемешаны int16_t и int32_t, компилятор 32-битный. Структурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию.
Так вот, структурка до 98 байт - не выравнивается, т.е ее размер соответствует сумме мемберов. А вот на 98байте компилятору ну просто очень нужно выровнять на оффсет 4.
Я конечно понимаю, что он ничего не должен, но ожидаю предсказуемого поведения в сходных случаях.

///2
Окай, я такой значит уже умный - вставляю __attribute__ ((__packed__)) и вроде счастлив. Авотмуй!
///2.1
Во первых, есть такой баг, мало того что плавающий (не всегда проявляется), а еще и мигрирующий между версиями.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
Т.е даже пример из документации https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes
может просто не работать!

///2.2
Целая песня, если у вас вложенные структуры, юнионы и смесь. Не надо думать, что вы написали __attribute__ ((__packed__)), и всё - с несанкционированными выравниваниями покончено. Работа этого аттрибута вполне зависит от погоды, наличия имени структуры, наличия typedef и положения аттрибута относительно порядка имя-аттрибут.

///3
Отдельная тема - качество и понятность генерируемого ассемблера, а за компанию и работа гнусного дизассемблера, которые не попадает в адреса относительно кода.

///4
Который раз твердили миру, -О3 не работает уже 10 лет. Если ваша программа крашится, нужно откатиться на -О2, а лучше и не пробовать. Последний раз - мы тут на форуме гоняли рейтрейсинг, живой пример.

///5
Из мелких придирок - отвратительно медленный старт под Windows всего гнусного тулчейна, жручесть памяти и скорость работы компилятора.

Сходу всё не вспоминается, потом продолжу.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321076
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм о баге с выравниваниванием я знал, но он мне не так сильно докучает..
вы часто пользуетесь этой фичей что ли?

на счет непопадания в адреса - иногда бывает :) это прикольно.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321118
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сюда же можно отнести качество кода stl наверное :)
если попытаться понять что там,то там вообще неразбериха. часто несколько операторов в одной строке, и, если ты попадаешь туда под отладчиком, приходится выполнять их все за раз, что досадно, если нужно войти в какую-то функцию - заходишь сначала во все потроха, а потом куда надо.
намешаны пробелы и табы, underscore и camel cale
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321260
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем??? Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат. Типа заголовка ethernet/tcp/udp пакетов. Но они маааааленькие. Никак не вылазят за такие большие объемы.
Во всех остальных случаях удобнее делать полноценную сериализацию.

Медленный старт? Где? Почему-то в моих тестах, VC намного медленнее... Впрочем, VC я обычно использую только если нету другого выхода и делаю это почти всегда из-под VS а GCC у меня запускается из makefile'ов всегда.



Если вы не любите gcc, вы просто не умеете его готовить.
:)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321322
locked
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-О2 в продакшене использовать нельзя.
-О3 - а это что такое??

Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен.

White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат.
Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321489
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНикогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем???
:)

встречал такое что одни и те же структуры используются программами на разных языках программирования
(COBOL и С, например)
в таких случаях без паковки не обойтись
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321762
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Год,

тогда можно прокси сделать..
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321972
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я уже написал, невыровненные структурки нужны для обмена по чужому ABI.

Еще пару вещей вспомнил

- Red zone. Коснется вас если только вы используете ассемблер (ну или ловите баги порчи стека) - укуренное использование. Т.е ваш стековый массив может краешком лежать в редзоне. Временные переменные, даже не ваши временные, а которые потребовались при оптимизации - тоже. Почему не размещаться с начала по порядку - хз. Возможно используется по порядку с конца.

- С99 в исполнении gcc обязывает вас все inine функции переписать как static inline, иначе будет ошибка линковки. Static inline это навязано стандартом, но реализация могла бы и упростить.... Я теперь знаю про extern inline, но в любом случае это жутко неудобно и несовместимо.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39322053
_Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglПо просьбам зрителей, да и что то у меня накопилось.

Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет.

///1
Пример первый -
........
.

Siemargl, а можно ссылочку на ваши программы созданные на С++ и gcc?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39322208
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locked-О2 в продакшене использовать нельзя.
-О3 - а это что такое?? .

У меня как-то и -O2 работает, и -O3 работает...
Не, конечно, багов нет только в коде божественного Виндуоза, это понятно, но всё же -- не так GCC и плох...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331139
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одной программе случилось так, что в разных .cpp-файлах есть 2 класса с одинаковыми именами:
1.cpp
Код: plaintext
1.
2.
3.
4.
5.
...
class message_box_t {
  ...
};
...

2.cpp
Код: plaintext
1.
2.
3.
4.
5.
...
class message_box_t {
  ...
};
...

Не copy-paste, классы разные. То есть это было нарушение ODR (one definition rule), но компиляторы C++ к сожалению не обязаны обнаруживать нарушения ODR. Один класс реально использовался, другой -- нет, просто остался как хлам. Оба класса были с виртуальными методами. Соответственно, для обоих классов генерировались vtable-ы с одинаковыми link-овочными именами (что-нибудь типа _message_box_t_vtable, зависит от компилятора). Но из всех одноимённых vtable-ов в финальном бинарнике должен остаться только один.

До поры до времени был Visual C++, его linker протаскивал в финальный бинарник vtable нужного класса, и всё работало нормально. Потом был GCC, его linker протаскивал в финальный бинарник vtable ненужного класса, поэтому нужный класс жил с чужим vtable-ом (своего тёзки). Это естественно глючило, так проблема и обнаружилась, ненужный класс был убран, и всё заработало.

То есть в данной ситуации Visual-овский linker оказался то ли умнее, то ли просто удачливее, чем GCC-шный linker. Короче, бойтесь нарушения ODR. Или переходите на более современный язык, который не позволит в одном namespace-е иметь 2 класса с одинаковыми именами :).
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331324
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.

Побочный эффект - если у вас объектник указан до использующего его функции другого, получишь ошибку линковки. Особенно доставляет, если есть циклические зависимости.

Раньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах.


Б) Сразу добавлю в темку - после смены версии вырос размер исполняемого файла. Для обычного helloworld для проверки - в 6 раз.
Посмотрел в .map - ОМГ сколько мусора, и фиг разберешься что зачем.

Справедливости ради, то если разберешься, то можно ручками сделать скрипт линкера с отбрасыванием чего тебе ненужного, вроде размотки стека исключений для .c программ (я еще не разобрался)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331599
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglРаньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах.С vtable-ами дублирование иногда неизбежно. Если например есть исходники:
message_box.h
Код: plaintext
1.
2.
3.
4.
5.
class message_box_t {
  ...
  virtual void timeout() {}
  ...
};

1.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

2.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

3.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

то vtable класса message_box_t будет во всех 3-ёх файлах (1.o, 2.o, 3.o для GCC; 1.obj, 2.obj, 3.obj для Visual C++). Linker протащит в финальный бинарник только один vtable. Но в данном случае всё нормально, потому что нет нарушения ODR.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39345982
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какой другой вы тогда посоветуете?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382802
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG

+2 std::thread
в сборке i686-6.2.0-win32-sjlj-rt_v5-rev1 отсутствует
а в сборке i686-6.2.0-posix-dwarf-rt_v5-rev1 работает через жо - thread.join() не гарантирует ожидания конца, как обязана
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382810
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В архитектуре x32 не использует AVX, хотя ему явно сказано
>-m32 -O2 -march=core-avx2 -mtune=core-avx2

Похоже, что работа ведется только для x86-64
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382819
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglВ архитектуре x32 не использует AVX, хотя ему явно сказано
>-m32 -O2 -march=core-avx2 -mtune=core-avx2

Похоже, что работа ведется только для x86-64
Не совсем так. Просто надо ручками дополнительно писать -mfpmath=sse
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382845
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG
У МС тоже, но NDEBUG автоматом добавлен в дефайны релиза
Код: plaintext
1.
2.
3.
4.
5.
// assert.h
#ifdef NDEBUG
    #define assert(expression) ((void)0)
#else
...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382884
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки???
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383042
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЭто мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет.
.

Ты имеешь в виду GCC в режиме C, или G++ ( C++ компилятор) , или оба ?
Уточни, пожалуйста.

Siemargl///4
Который раз твердили миру, -О3 не работает уже 10 лет. Если ваша программа крашится, нужно откатиться на -О2, а лучше и не пробовать. Последний раз - мы тут на форуме гоняли рейтрейсинг, живой пример.


У меня работает -O3 на моём проекте, вполне всё ОК.
Четыре года назад я работал на GCC на проекте на чистом C, с -O3 всё также работало адекватно.
К тому же, -O3 -- комплекный параметр, он включает, как я понимаю, несколько оптимизаций, и, если что-то и не работает, надо говорить о каждой отдельно, а не о всём вместе.

О проблемах Win-версии лучше всего писать основному мейнтейнеру , niXman-у, сюда
http://www.rsdn.org/account/info/75665

И да, GCC -- не самый быстрый в мире компилятор, а fork на винде работает долго...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383066
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.

Так любой линкер так и должен работать!
То, что ты нарушаешь ODR -- это ТВОИ проблемы!
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383068
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG


Родной , так И НЕ ДОЛЖНЫ ОНИ УДАЛЯТЬСЯ без NDEBUG.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383092
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСтруктурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию.
Так вот, структурка до 98 байт - не выравнивается, т.е ее размер соответствует сумме мемберов. А вот на 98байте компилятору ну просто очень нужно выровнять на оффсет 4.
Я конечно понимаю, что он ничего не должен, но ожидаю предсказуемого поведения в сходных случаях.
как все печально-то...

по правде говоря существует гласное ABI правило - ничего сложнее ordinal типов (максимум 8 байт) не передавать, особенно чужим функциям. и функции с больше чем 3-мя параметрами уже страшное зло (их невозможно протестировать - слишком много вариантов получается в матрице тестовых значений).

уже на 16 байтах начинаются чудеса с вовлечением XMM регистров и прочей несовместимости.

а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383458
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSiemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки???Да, и вправду, похоже меня IDE разбаловали, которые сами добавляют.
MasterZivSiemarglПётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.
Так любой линкер так и должен работать!
То, что ты нарушаешь ODR -- это ТВОИ проблемы!Ну не так - он должен выругаться об неоднозначности, а не линковать что первое попало.
dbpatch..бред про ХММ убран...
...а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.Я и передаю по указателю. Какая разница, если выравнивание навернуто.

Так так, похоже про thread.join() я соврал - у меня было больше потоков, чем я думал - корректно работает.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383461
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locked-О2 в продакшене использовать нельзя.
-О3 - а это что такое??

Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен.

White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат.
Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс.
Почему нельзя использовать -O2 кто-нибудь скажет? Кроме того, что дебажить неудобно.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383530
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНу не так - он должен выругаться об неоднозначности, а не линковать что первое попало.
Не должен.
Как раз по дизайну он должен брать первое из нескольких имен в порядке указания их библиотек.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383551
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargldbpatch..бред про ХММ убран...
...а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.Я и передаю по указателю. Какая разница, если выравнивание навернуто.

Так так, похоже про thread.join() я соврал - у меня было больше потоков, чем я думал - корректно работает.

бред про XMM? ну ну.

а так, ты там выше писал дословно:

> Структурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию

про указатель ты там ничего не писал. путаешься в показаниях?
в остальном - ты опять, в 25 раз СЗЗБ. кто мешает выровнять структуру вручную, накидав туда dummy полей нужных длин и типов?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383572
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySiemarglНу не так - он должен выругаться об неоднозначности, а не линковать что первое попало.
Не должен.
Как раз по дизайну он должен брать первое из нескольких имен в порядке указания их библиотек.Где кстати прописано поведение линкера ?
Ты как спец по стандартам, можешь знать )
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383659
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья, я категорически против правки моих постов, даже с благой целью улучшения этого убогого сайта. Ок ?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383693
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglГде кстати прописано поведение линкера ?
Ты как спец по стандартам, можешь знать )
Мне лень искать. Но алгоритм выбора функции среди одноименных четко описан.
И к стандартам я никакого отношения не имею, а наоборот люблю частные случаи ))
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383798
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglИлья, я категорически против правки моих постов, даже с благой целью улучшения этого убогого сайта. Ок ?
Он оказал тебе услугу. По джентльменски, не став клеить стикер "Отредактировано".
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383982
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglИлья, я категорически против правки моих постов, даже с благой целью улучшения этого убогого сайта. Ок ?

ОК, просто не давай повода...
:-)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39384688
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyМне лень искать. Но алгоритм выбора функции среди одноименных четко описан.
В огороде бузина, а в Киеве — дядька.

Какое отношение overload resolution имеет к выбору линкером символа из нескольких translation units?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39384912
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Common LispКакое отношение overload resolution имеет к выбору линкером символа из нескольких translation units?
Никакое. Это вы домыслили про перегрузку ))

А вот например то про что я говорил:
1) .cpp с функцией f() возвращающей 1
2) .cpp с функцией f() возвращающей 2 с атрибутом weak
3) программа собранная с 1 и 2
Какая из f будет взята четко определено.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39384982
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКакая из f будет взята четко определено.
Лично я ещё с первой своей встречи с С помню, что порядок указания объектных файлов и
библиотек в командной строке линкера имеет очень большое значение. Именно потому, что
функция берётся из первой встреченной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39385083
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то у меня не получается воспроизвести, хотя точно был какой то казус
D:\VSProjects\ambigui>cl main.cpp tru1.cpp tru2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

main.cpp
tru1.cpp
tru2.cpp
Generating Code...
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.

/out:main.exe
main.obj
tru1.obj
tru2.obj
tru2.obj : error LNK2005: "int __cdecl fnx(void)" (?fnx@@YAHXZ) already defined in tru1.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found

D:\VSProjects\ambigui>gcc main.cpp tru1.cpp tru2.cpp
E:\windows\TEMP\ccJmDlXv.o:tru2.cpp:(.text+0x0): multiple definition of `fnx()'
E:\windows\TEMP\ccnEcvSD.o:tru1.cpp:(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

==============вариант с библиотечной ф-цией=================

D:\VSProjects\ambigui>gcc main.cpp tru1.cpp atexit2.cpp
E:\windows\TEMP\ccCiW5FA.o:atexit2.cpp:(.text+0x0): multiple definition of `atexit'
D:/codeblocks-16.01/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../crt2.o:crt1.c:(.text+0x2c0): first defined here
collect2.exe: error: ld returned 1 exit status

D:\VSProjects\ambigui>gcc --version
gcc (tdm-1) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39385350
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспроизводится для С, но не CPP.

Причем msvc2003 и gcc работают в этом случае одинаково.

Век живи, век учись (
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39390699
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот. Как раз повторно наткнулся на грабли 2)

Претензии:
1)Полный бордель внутри каталога gcc
-include лежат в gcc\include,
но
для С++ есть своя версия, лежит gcc\lib\gcc\mingw32\4.9.2\include\c++

-ar.exe, as.exe и еще пяток хранятся в двух копиях в разных подкаталогах

-lib частично лежат в gcc\lib,
но
немного в gcc\mingw32\4.9.2

2)ИЧСХ, обычно компилятор сам знает, где искать свое барахло, но иногда....
Ну не хочет он, ****, при сборке dll видеть -lgcc, ни сам, ни если ему под нос положить.
Решил: Помогает только положить под нос и сказать ld ... libgcc.a

3)Статическая сборка как минимум под Windows потребует замену gcc libc,
Но динамическую же сборку - могу записать в плюс: сборку с-программ с msvcrt.dll без лишних зависимостей вообще, а С++ рантайм пару мегабайт и без геморроя с манифестами и версиями.

4)Одна и так же версия компилятора, с одинаковым makefile порождает библиотеки разного размера, если компилить под Win и под Lin.
Страшно брать и линковать с разных мест сборки, но вроде работает.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39390721
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl1)Полный бордель внутри каталога gcc
И? Кто тебе виноват, что ты используешь кривую и неродную систему, с оберточным костылем?
Пересаживайся на Linux, где gcc мейснтрим, там будет тебе феншуй по полной

Siemargl2)
Windows Windows Windows


Siemargl3)Статическая сборка как минимум под Windows потребует
Ну что за детский сад, штаны на лямках!

Под Windows есть clang/C2 в составе MS VS 2015, если так уж сильно хочется последних C++ ништяков.

Какой смысл сидеть и колоться об реально никем не поддерживамую платформу?

Siemargl4)Одна и так же версия компилятора, с одинаковым makefile порождает библиотеки разного размера, если компилить под Win и под Lin.
Страшно брать и линковать с разных мест сборки, но вроде работает.

Вообще жесть. Ты поди и про отличия в ABI еще не почитал нигде?
https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions

Ах ну да, про XMM регистры было зачтено за бред, я забыл :):)

Может стоит в Java мир уйти, там-то ничего не отличается?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391124
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch ...

Коллега dbpatch суров, но справедлив...
:-)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391126
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, весть же топик не совсем про GCC, а про его порт на Win, именуемый MinGW, так ?
Мы должны это подчеркнуть!
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391203
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchSiemargl1)Полный бордель внутри каталога gcc
И? Кто тебе виноват, что ты используешь кривую и неродную систему, с оберточным костылем?
Пересаживайся на Linux, где gcc мейснтрим, там будет тебе феншуй по полнойНесмотря на то, что я в 96% случаев пользуюсь MingGW, вполне в состоянии посмотреть и в "родной" системе (под рукой Ubuntu14):
include находим в /usr/include, но
часть лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8/include
бинарники лежат в /usr/bin, но
cc1 и cc1plus лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8/

Практически такой же бардак (только либы (.a) вместе лежат, что впрочем (2) лечит)
dbpatchSiemargl3)Статическая сборка как минимум под Windows потребует
Ну что за детский сад, штаны на лямках!

Под Windows есть clang/C2 в составе MS VS 2015, если так уж сильно хочется последних C++ ништяков.

Какой смысл сидеть и колоться об реально никем не поддерживаемую платформу?Ага, Clang под Windows только вышел, никем не используется (а еще он в CBuilder10 есть).
И уровень поддержки там отличается от gcc. /sarcasm

Кроме того, я часто пользуюсь кросс-компилятором, где выбора у меня просто нет.
dbpatchSiemargl4)Одна и так же версия компилятора, с одинаковым makefile порождает библиотеки разного размера, если компилить под Win и под Lin.
Страшно брать и линковать с разных мест сборки, но вроде работает.

Вообще жесть. Ты поди и про отличия в ABI еще не почитал нигде?
https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions

Ах ну да, про XMM регистры было зачтено за бред, я забыл :):)ABI тут ни при чем, целевой таргет одинаковый, как и версии компилятора.

Про XMM в привязке к передаче параметров-структур и действительно бред.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391479
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargldbpatchпропущено...

И? Кто тебе виноват, что ты используешь кривую и неродную систему, с оберточным костылем?
Пересаживайся на Linux, где gcc мейснтрим, там будет тебе феншуй по полнойНесмотря на то, что я в 96% случаев пользуюсь MingGW, вполне в состоянии посмотреть и в "родной" системе (под рукой Ubuntu14):
include находим в /usr/include, но
часть лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8/include
бинарники лежат в /usr/bin, но
cc1 и cc1plus лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8/
И? у тебя в системе может стоять одновременно и 4.8, и 5.3.

Как нужно разделять, озвучишь?

И тебя что, заставляют в makefile эти пути вручную прописывать? Да неужели?

SiemarglАга, Clang под Windows только вышел, никем не используется (а еще он в CBuilder10 есть).
И уровень поддержки там отличается от gcc. /sarcasm
где там? в clang или msvc?

насколько я знаю, в ms поддержка очень оперативная, с ними реально приятно работать


SiemarglКроме того, я часто пользуюсь кросс-компилятором, где выбора у меня просто нет.
тем более странно сидеть под виндой. кто мешает взгромоздить актуальный linux в одну из систем виртуализации?
там даже есть интеграция с visual studio, есть плагин соотвествующий (вернее пара - свой и wingdb) - сидишь в нормальной IDE
отлаживаешь линукс процессы, красота


SiemarglПро XMM в привязке к передаче параметров-структур и действительно бред.
Нет не бред, структура (не указатель, а структура целиком) длиной до 16 байт при передаче упаковывается в 128 битный регистр, известный факт-фича.

Но ты тогда не смог пояснить, что передаешь именно указатель, и кто тебе виноват?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391491
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglABI тут ни при чем, целевой таргет одинаковый, как и версии компилятора.

про кросскомпиляцию ты ничего не говорил, тут за тебя всегда должны догадываться?

а так, в мире существует еще и link time optimization, версии линкера тоже одинаковые, и у компиляторов, прям тютелька в тютельку, и номера релизов вплоть до номеров ревизий совпадают и собраны они из единого репозитория?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391520
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch,

Читать ты не умеешь, по делу сказать тоже не можешь. Так что отвечать тебе смысла не вижу.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391534
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, не уточнил.

Весь этот файловый бардак обычно не заметен.

Пока не нужно использовать -nostdlib, который используется в основном при кросс-компиляции.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391787
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl include находим в /usr/include, но
часть лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8/include
И у этого есть очень простое объяснение.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391789
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКакая из f будет взята четко определено.
А какая будет weak где определено?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39391904
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargldbpatch,

Читать ты не умеешь, по делу сказать тоже не можешь. Так что отвечать тебе смысла не вижу.

ты плакал что размеры бинариков собранные отличаются при кросскомпиляции (как мы выяснили потом) под разными хост платформами.

тебе задали простой вопрос - совпадают ли версии компилятора и линкера. и библиотек (код из статичных библиотек очень даже может инлайниться).

и знаешь ли ты про LTO

вместо этого ты развесил обиженно губы, аки девочка какая-то.

видно ты и про LTO не в курсе, и как версии срававать - тоже не знаешь. смешно, кисо обиделось.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39405253
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующее чудо - не gcc, но друг его GNU make. Перестал собираться элементарный пример.

Возможно, сменилась версия make c 3.82 на 3.82.90, но не факт, что это причина

Перестало подхватываться правило (а работало раньше)
Код: plaintext
1.
2.
%.o:%.c $(SOURCES)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<


Причем, в make есть builtin правила - и оно подхватывает CFLAGS, но не INCLUDES, так что выглядело очень похоже на верную строку.
<tab> имеется
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39405261
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пилять, рядом такой же файл обрабатывается.

В общем, если
Код: plaintext
1.
2.
3.
SOURCES = main.c	\
		fontlib.c    \
	  $(NULL)

то правило обнаруживается и работает.
А если
Код: plaintext
1.
2.
SOURCES = main.c	\
		fontlib.c    

то не работает =)

Еще можно убрать вообще зависимость от SOURCES в неявном правиле.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39484256
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и всплыло. Как я изначально выставлял претензию на "качество и понятность генерируемого ассемблера", так оно и поплыло

Сгенерированный странным образом код gcc "ломает" работу Intel SkyLake Hyper-Threading
https://habrahabr.ru/post/332552/

TL:DR
gcc генерирует 64-битный код, заполняя иногда только часть регистра, т.е не rax, rbx,... а AH, BH,...
Это иногда ломает ноги HT с непредсказуемым поведением и глюками
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39484294
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, используешь MSYS2 ? Попробуй его в связке с NetBeans IDE (хоть и тормознутая из-за применения Java, но очень грамотная IDE).
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39484303
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСгенерированный странным образом код gcc "ломает" работу Intel SkyLake Hyper-Threading
ИМХО GCC не виноват что интел кривой проц выпустил.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39515420
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще пару клевых моментов

1. tellg /seekg не работает для _одного и того же_ текстового файла (это еще объяснимо)

2. если мы какой то файл через ifstream открываем в бинарной моде, вывод cout наворачивается полностью (а вот это необъяснимо)

gcc 6.2
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39515556
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. тоже объяснимо - в строки попадает \r и ес-но вывод на консоль затирается
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39515679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закодь пока на fopen/fread а с потоками потом разгребем.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39515741
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSiemarglСгенерированный странным образом код gcc "ломает" работу Intel SkyLake Hyper-Threading
ИМХО GCC не виноват что интел кривой проц выпустил.
работа с частью регистра - сомнительная оптимизация тем не менее
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39543629
SiemarglГде кстати прописано поведение линкера ?Линкер или не линкер — это деталь реализации, а про нарушения условий определения одного и того же класса в разных единицах трансляции сказано
http://eel.is/c draft/basic.def.odr#6.sentence-4 If the definitions of D do not satisfy these requirements, then the behavior is undefined.undefined behavior не требует диагностических сообщений
http://eel.is/c draft/intro.compliance#def:diagnosable_rules The set of diagnosable rules consists of all syntactic and semantic rules in this document except for those rules containing an explicit notation that “no diagnostic is required” or which are described as resulting in “undefined behavior”.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39543630
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSiemarglСгенерированный странным образом код gcc "ломает" работу Intel SkyLake Hyper-Threading
ИМХО GCC не виноват что интел кривой проц выпустил.
Да GCC вообще ни в чём не виноват. GCC — это такое произведение искусства на тему "как не нужно делать".
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39669883
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередное обновление.

gcc6.2/win64

Проблема - нестабильность кода, недетерминированная компиляция.

Вносим изменения в программу, например закомментируем неиспользуемые функции или вносим в них мелкие изменения.

Рабочий код - меняется случайным образом (перестановка использования регистров, стека, перестановка операций итп), наблюдалось замедление до 10%.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39671172
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще +проблема

Бинарник, собранный gcc 6.2, не запускается под Win2008SBS (ядро от Vista).

Где то похерили совместимость.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39671434
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, что показывает таблица импорта этого бинарника?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39671500
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devSiemargl, что показывает таблица импорта этого бинарника?ничего особенного, kernel32.dll и msvcrt.dll
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39671635
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, попробуй положить рядом с исполняемым файлом библиотеку msvcrt.dll с той системы, на которой компилировалась прога.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39674328
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglОчередное обновление.

gcc6.2/win64

Проблема - нестабильность кода, недетерминированная компиляция.

Вносим изменения в программу, например закомментируем неиспользуемые функции или вносим в них мелкие изменения.

Рабочий код - меняется случайным образом (перестановка использования регистров, стека, перестановка операций итп), наблюдалось замедление до 10%.
Обновлю чуть уточнениями, пока не утонуло в памяти.
Один и тот же исходник (используется __m128, никакой системно-зависимой хрени).

Но результат компиляции работает в 3-4 раза! медленнее если собран gcc под Linux.
Опции одинаковы.
Платформа компилятор время сWin64 gcc 6.2 12FreeBSD64 Clang6 12Linux64(Ubuntu14) gcc6.? 38Linux64(Ubuntu18) gcc7.3 38Linux64(Ubuntu14) Clang6 11


rdb_devSiemargl, попробуй положить рядом с исполняемым файлом библиотеку msvcrt.dll с той системы, на которой компилировалась прога.Бесполезно, под Vista32 вылетает при запуске.
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как я люблю gcc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]