Re[11]: А чего молчим про Crowdstrike
От: vdimas Россия  
Дата: 25.07.24 13:39
Оценка:
Здравствуйте, Константин Б., Вы писали:

V>>Вызывается изнутри _Unwind_RaiseException ...

КБ>А _Unwind_RaiseException кто вызовет?

Его вызывает ф-ия __cxa_throw — это "высокоуровневый" хелпер для запуска исключения, т.е. чтобы конструкция throw компилялась в малое кол-во опкодов.
Унутре __cxa_throw инициализирует локальные данные потока объектом-исключением и текущим контекстом функции и вызывает _Unwind_RaiseException.

Затем изнутри __cxa_throw (или по возврату из неё — в зависимости от реализации) вызывается:

__builtin_eh_return (offset, handler), which adjusts the stack by offset and then jumps to the handler.

Или другой аналог longjmp.

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


V>>В случае структурных исключений ядро просто трансформирует аппаратные прерывания в софтовые с известной на уровне ABI операционки структурой данных, описывающих исключение.

V>>Т.е., сводит сигналы различной природы к одному АПИ.
КБ>Да. В SEH понятно кто что вызывает. А кто вызывает _Unwind_RaiseException/longjump?

Примерно так:
throw SomeException();


; передача аргументов в x64_call: RDI, RSI, RDX, RCX...
  mov    edi, sizeof(SomeException)
  call   __cxa_allocate_exception
 
  mov    rbx, rax
 
  mov    rdi, rax
  call   SomeException::SomeException()

; __cxa_throw(void *thrown_object, std::type_info *tinfo, void (*dest)(void *))
  mov    rdx, SomeException::~SomeException()
  mov    rsi, typeid(SomeException)
  mov    rdi, rbx
  call   __cxa_throw

; далее зависит от реализации - где происходит вызов деструктора исключения -
; внутри __cxa_throw или реализация разбита на две фазы
  mov    rdi, rbx
  mov    rbx, rax
  call   __cxa_free_exception
 
  // если по возвращении, то вызываем вторую фазу обработки исключения
  mov    rdi, rbx
  call   _Unwind_Resume ; внутри будет вызван аналог __builtin_eh_return



V>>longjmp — это ...

КБ>Я знаю что оно такое и что делает. Вызывает-то его кто?

Сгенерированный компилятором С++ код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.