commit -m "better"
2.96K subscribers
868 photos
105 videos
3 files
2.07K links
just random thoughts
Download Telegram
https://www.phoronix.com/news/GNU-Binutils-SFrame #dwarf

Тут вот пишут, что gnu binutils теперь умеют строить специальную секцию со слепком небольшого объема данных из dwarf, нужной исключительно для раскрутки стека.

Бинари получаются меньше, стек раскручивается быстрее.

Круто?

https://www.google.com/search?q=compact+unwind

Apple уже давно имеет формат для "compact unwind", он особо нигде не афишируется, но clang его умеет для mach-o. Я регулярно совершал набеги, чтобы он завелся и под elf, там делов-то - сгенерить нужную секцию, а libc++abi/llvm unwind уже давно в это умеют. Безуспешно(не потому что сложно, а потому что лень).

"Не договорились", а как же иначе.

(кстати, именно из-за этого у меня по всем замерам пару лет назад получалось, что в MacOS исключения летят раз в 5 быстрее)
👍8🔥5🤡1
#abi #dwarf #elf #unwind #gold

Я как-то кидал ссылку на реализацию базовых функций Itanium ABI, для раскрутки стека и исключений. Вот, в каком-то смысле, продолжение - а что же там такое делает компилятор с линкером на пару, чтобы поддержать itanium runtime?

https://lesenechal.fr/en/linux/unwinding-the-stack-the-hard-way

Текст - огонь. Он явно войдет в мою золотую коллекцию ссылок про низкоуровневое устройство современных runtime.

По многим темам в интернетах не хватает ссылок уровня upper intermediate - это когда ты еще не прочел 10 стандартов по 1000 страниц каждый, но, после прочтения подходящего текста, ты уже можешь взять в руки какой-то инструментарий, и сделать что-то содержательное.

Есть куча зумерских восторгов вида "гля я заменил __cxa_throw, у меня программа теперь падает новым интересным образом", есть спецификации на ELF/DWARF, которые ни один нормальный человек читать не захочет (если он не на зарплате, конечно), а вот текстов "посредине" - очень и очень мало.

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

Прямо очень, очень хорошо.

Большую часть того, что там написано, я и так знал, но чтобы вот так, системно, в одном месте - никогда не видел.
🔥21👍4💯1
commit -m "better"
https://www.phoronix.com/news/GNU-Binutils-SFrame #dwarf Тут вот пишут, что gnu binutils теперь умеют строить специальную секцию со слепком небольшого объема данных из dwarf, нужной исключительно для раскрутки стека. Бинари получаются меньше, стек раскручивается…
#dwarf

https://lwn.net/Articles/930622/

Вот, не только у меня получилось, что "быстрее", коллеги предлагают запилить новый stack unwinder в ядро.

Видимо, для потребителей типа perf, и прочих strace.

Тема хорошая, насущная, а то некоторые все еще используют gdb в проде, чтобы получать хорошие трейсы и, соответственно, профили нагрузки.
🔥12👍1🤔1
Искал тут в инторнетах ответ на вопрос "а как напечатать содержимое thread local переменной в статически слинкованной программе в gdb" (ответ, кстати, совершенно нетривиальный, но про это в другой раз)

В процессе поиска наткнулся на совершенно шедевральный труд - https://fasterthanli.me/series/making-our-own-executable-packer

Все про #elf, #dwarf, #gdb, #glibc, shared/static linking, устройство thread local, и все такое.

Чувак про это пишет в контексте разработки executable packer (на Rust, а как же иначе), я до сих пор читаю (549 minute read!!!), и вы почитайте.

#gold
👍18🤯11❤‍🔥3🔥32😁21🤔1😱1