LINUX.ORG.RU

segfault с -O0


0

2

Привет. Захотел я тут отладить приложение, чтобы переменные не оптимизировались, но получаю SIGSEGV в main почему-то. Выглядит примерно так:

(gdb) bt
#0  0x004b1814 in main (argc=757099628, argv=0x74786557)
Довольно странное значение argc. Какая из оптимизаций может привести к тому, что в стеке фигня окажется? Архитектура mips.

★★★★★

Может быть банальное переполнение стека. Если не ошибаюсь параметры на мипсе передаются через стек и без оптимизации их может оказаться очень много. Но это всё конечно пальцем в небо.

beastie ★★★★★ ()

Это форум гадания по бектрейсу?

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

Да, именно он, тред размышлений, так сказать. Код ничего не даст, поскольку если закомментировать строку, на которую ссылается gdb, то он упадёт на следующей.

UVV ★★★★★ ()

Тут самое место сказать: телепаты в отпуске!

invy ★★★★★ ()
Ответ на: комментарий от UVV

А если минимальный исходник скомпилировать с теми же параметрами и загнать в gdb, та же фигня?

Kiborg ★★★ ()

ради хохмы можно и argv принтануть глянуть

x0r ★★★★★ ()

disas

info registers

cat /proc/<pid>/maps

mv ★★★★★ ()

не используешь ли сошки от «сторонего производителя»?

nanoolinux ★★★★ ()
Ответ на: комментарий от UVV

Да, именно он, тред размышлений, так сказать.

Не, ну нифига себе! Тогда я мыслю так, что весь код надо переписать. На li^W python

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

покажи ldd хотя бы. Но хотелось бы минимальный пример. с кодом, ключами компилятора, с параметрами линкера.

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

не используешь ли сошки от «сторонего производителя»?

А вот использую, кстати. Ты думаешь, если они собраны с -O2, то всё может накрыться медным тазом из-за этого? so - оно же вроде бы PIC, или я не совсем догоняю, как оно здесь повлияет?

UVV ★★★★★ ()
Ответ на: комментарий от x0r

argv тоже в никуда указывал, cannot access memory at address

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

если они собраны с -O2

В норме пофиг как они собраны, ABI всё равно такой же (так ведь?). Но ты продолжай дальше морочить голову.

Кстати, а тебе нравится Найджел Беннетт?

shamaz ()

У тебя в argc 'll -'. А в argv 'Wext'. Вместе получается 'll -Wext'

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от UVV

Чесно говоря подробностей не знаю. У меня под офтопиком было подобное много раз, собираешь длл mingw, а приложение msvc (или наоборот, точно не помню уже). Смотришь дебагером - сегфолт в первой строчке main. После ковыряний в гугле пришёл к выводу, что это ещё на этапе инициализации дллок динамическом линкером какая-то хрень происходить и что-то там повреждается. Глубоко копать не стал, скомилил все одним компилером - всё заработало.

Может и у тебя подобная ситуация, только под линуксом.

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

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

Или я не прав?

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

http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html

Да, всё верно. Но прикол в том, что до ф-ии main может выполняеся ещё куча всякой разной всячины. Допустим в __attribute__((constructor)) какой-то умный засунул такое например. В каком месте gdb покажет сегфолт?

nanoolinux ★★★★ ()
Ответ на: комментарий от shamaz

в общем случае неправ

от таких предположений у французов ракеты падали, например

anonymous ()

гадалки в отпуске, ващета

до main происходит инициализация статики, которая скорее всего портит... но не стек, а регистры...

компилятор какой?

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

Ох эти штучки-дрючки gcc. То есть при подключении библиотеки запустится конструктор? Так пусть ТС покажет уже дисассембл, надоело это гадание.

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

от таких предположений у французов ракеты падали, например

Какие? Интересно было бы почитать про такой фейл

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

ариан-5. полные материалы расследования выложены в интернетах.

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

не за что

классика быдлокода, однако. надо знать

anonymous ()

Разница между -O0 и -O2 в первую очередь в sizeof всяких там структур. В C++ инициализация/конструкторы всяких глобавльных объектов скорее всего дадут сегфолт при смешивании -O0 с -O2. Посмотри на сторонние либы, возможно что-то из них нужно пересобрать с -O0.

Также может быть охрененно большой массив внутри main (упадет прям на входе в main) либо поломанный тулчейн (либо компилер, либо линкер, либо какой-то crt*.a из которого вызовется main).

Конкретно по теме. На i386 к похожим эффектам приводит -mregparm=2. Вообще есть много опций оптимизации, ломающих ABI.

P.S. Hello world хоть работает?

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