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 быстрее)
Тут вот пишут, что gnu binutils теперь умеют строить специальную секцию со слепком небольшого объема данных из dwarf, нужной исключительно для раскрутки стека.
Бинари получаются меньше, стек раскручивается быстрее.
Круто?
https://www.google.com/search?q=compact+unwind
Apple уже давно имеет формат для "compact unwind", он особо нигде не афишируется, но clang его умеет для mach-o. Я регулярно совершал набеги, чтобы он завелся и под elf, там делов-то - сгенерить нужную секцию, а libc++abi/llvm unwind уже давно в это умеют. Безуспешно(не потому что сложно, а потому что лень).
"Не договорились", а как же иначе.
(кстати, именно из-за этого у меня по всем замерам пару лет назад получалось, что в MacOS исключения летят раз в 5 быстрее)
Phoronix
GNU Binutils Lands New "SFrame" Format Support For Simple Stack Unwinding
Being merged this week to GNU Binutils is initial support for reading and writing to new 'SFrame' sections of binaries.
👍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), по текущему контексту.
Прямо очень, очень хорошо.
Большую часть того, что там написано, я и так знал, но чтобы вот так, системно, в одном месте - никогда не видел.
Я как-то кидал ссылку на реализацию базовых функций 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), по текущему контексту.
Прямо очень, очень хорошо.
Большую часть того, что там написано, я и так знал, но чтобы вот так, системно, в одном месте - никогда не видел.
lesenechal.fr
Unwinding the stack the hard way • lesenechal.fr
Tutorial on how to make a stack trace or backtrace manually unwinding the stack using ELF’s .eh_frame and call frame information (CFI)
🔥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 в проде, чтобы получать хорошие трейсы и, соответственно, профили нагрузки.
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
В процессе поиска наткнулся на совершенно шедевральный труд - 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
fasterthanli.me
Making our own executable packer
In this series, we’ll attempt to understand how Linux executables are organized, how they are executed, and how to make a program that takes an executable fresh off the linker and compresses it - j...
👍18🤯11❤🔥3🔥3✍2😁2❤1🤔1😱1
commit -m "better"
Тут вот пишут, что gnu binutils теперь умеют строить специальную секцию со слепком небольшого объема данных из dwarf, нужной исключительно для раскрутки стека.
https://discourse.llvm.org/t/rfc-adding-sframe-support-to-llvm/86900/3 #dwarf #llvmweekly
Поддержка sframe в llvm, не прошло и трех лет!
Вообще, новость, конечно, позитивная, по модулю того, что llvm уже умеет "compact unwind" на mach-o платформах.
Поддержка sframe в llvm, не прошло и трех лет!
Вообще, новость, конечно, позитивная, по модулю того, что llvm уже умеет "compact unwind" на mach-o платформах.
LLVM Discussion Forums
[RFC] Adding SFrame support to llvm
SFrame (“simple frame”) is a new format for unwinding the stack. It is used inside the Linux Kernel and has good support in the GNU toolchain. It is more fully described here: I have a prototype implementation for both assembly and linking nearing completion…
👍4🔥3🤡2🆒1