Поскольку ответа не было, я провел небольшое исследование, и это должно помочь:
- Убедитесь, что функция используется
main()
в случае бинарного ящика, или функцией pub
в случае контейнера библиотеки (или самим pub
). - Чтобы компилятор не встраивал ваш тест, отметьте его
#[inline(never)]
- Поиск функции имя, которое должно найти начало, которое выглядит так:
.type <mangled_name>,@function
<mangled_name>:
.cfi_startproc
Найдите конец функции, который отмечен:
.Lfunc_end<number>:
.size <mangled_name>, .Lfunc_end<number>-<mangled_name>
.cfi_endproc
Иногда ему может предшествовать retq
, но ненадежно.
Те Строки, которые начинаются с точки и заканчиваются не двоеточием, например .type
, являются директивами. Директивы, которые понимает ассемблер GNU, задокументированы здесь , и вывод --emit asm
должен быть допустимым вводом для ассемблера GNU.
Compiler Explorer и cargo-asm
Кажется, что Compiler Explorer фактически хранит весь файл и не ищет функции, он просто отфильтровывает определенные строки. По крайней мере, это то, что, по-видимому, делает исходный код .
cargo-asm
, по-видимому, специально ищет .cfi_endproc
на Linux и Ma c, и .seh_endproc
на Windows.