LINUX.ORG.RU

Какая опция линкера/компилятора отвечает за включение кода до main из либы

 , ,


1

2

Всем привет.

В общем такая ситуация. Есть некая библиотека libololo.a В этом архиве содержится множество .o файлов. В том числе для avx512.

lib_ololo_avx2.o

lib_ololo_avx512.a

В исходном файле lib_ololo_avx512.cpp имеется код в глобальном пространстве (вне функций и классов).

Есть два приложения, одно компилится через самописный Makefile библиотека линкууетя -L<path> -lololo

Это приложение нормально работает.

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

Так вот, второе приложение падает до захода в main, оно и понятно - этот код должен(в глобальной области) должен выполнятся до main, а платформа имеет только avx2.

Но вопрос в том, почему первая програ имеет такие проблемы, а вторая нет. Очевидно, что за счет каких то опций.

Я пробовал добавлять -O2 к опциям, убирать -g, а так же убрал -export-dynamic из унаследованных опций. Это все не помогло.

Есть еще какие-нибудь идеи?

P.S.: Автором обеих внешних либ является сторонний разработчик, поэтому мне надо проанализировать ситуацию и выслать свою ревью. Поэтому советы вроде «убрать код из глобальной области», «убрать avx512 из сборки для avx» не канают=)

★★★★★

сторонний разработчик
советы вроде ... не канают

Вот так и ведется реальная разработка, все паттерны/антипаттерны мимо, всё решает исключительно рандом стороннего разработчика, так нужно.

anonymous
()

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

xaizek ★★★★★
()

Кажется разобрался это -Wl,--whole-archive ... -Wl,--no-whole-archive

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вот так и ведется реальная разработка, все паттерны/антипаттерны мимо, всё решает исключительно рандом стороннего разработчика, так нужно.

Я скорее о том, что мне надо отослать им анализ проблемы, а решить проблему лучшим образом должны уже они. То есть для меня эти советы все равно бессмыслены=)

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от anonymous

злые люди отобрали у тебя objdump и gdb? сочувствую

Ээээ, а при чем тут gdb и objdump? Я отлично знаю какая инструкция неверная, я отличнаю знаю в каком месте сорцов она написанна, я отлично знаю что входит в .a архив. Мне было интересно какие опции компилятора приводят к двум разным результатам, objdump и gdb мне не дадут ответы на этот вопрос.

Dudraug ★★★★★
() автор топика

ifdef EIXCLUDE_CONSTRUCTORC_CODE

__attribute__((destructor)) blablabla

endif

ну ты понял, если я правильно понял

Deleted
()
Ответ на: комментарий от Deleted

Я напорачил... ну не важно всё равно суть о чём я ясна. Но сорян

Deleted
()
Ответ на: комментарий от annulen

Все верно. Код который вызывал ошибку инициализирует статическую переменную. Но находится он в.o файле внутри .a который никак не используется. Т.е. Эта стат переменная никак не используется. Код должен быть выполнен до main. В случае линковки вне --whole-archive этот код не попадает в бинарь.

И еще раз. Я искал не решение проблемы, а понимания, что происходит. Почему в одних случаях ок, а в других нет. То есть проблема НЕ будет решаться через удаление этой опции.

Dudraug ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.