LINUX.ORG.RU

segmentation fault

 ,


1

2

Привет, x32, вот такой выхлоп от gcc -S

.LLSDACSE1:
	.byte 0x1
	.byte 0
	.align 4
        .long DW.ref._ZTI14Fake_Exception-.

DW.ref._ZTI14Fake_Exception:
	.long _ZTI14Fake_Exception
	.hidden DW.ref._ZTI9Exception
	.weak DW.ref._ZTI9Exception
        .section .data.DW.ref._ZTI9Exception,"awG",@progbits,DW.ref._ZTI9Exception,comdat

_ZTI14Fake_Exception:
	.long _ZTVN10__cxxabiv117__class_type_infoE+8
	.long _ZTS14Fake_Exception
	.weak _ZTS14Fake_Exception
        .section .rodata._ZTS14Fake_Exception,"aG",@progbits,_ZTS14Fake_Exception,comdat
пытаюсь под gdb прочитать адрес _ZTI14Fake_Exception::_ZTVN10__cxxabiv117__class_type_infoE+8
(gdb) x/1aw 0x401743      # .LLSDACSE1+4
0x401743:       0x190000
(gdb) x/1aw 0x190000
0x190000:       Cannot access memory at address 0x190000
модуль загружен в память по адресу 0x400000. Что я не так делаю?
При этом, адрекс _ZTVN10__cxxabiv117__class_type_infoE+8 == 0x402ed8 (посмотрел по символам модуля+адрес загрузки+8).

★★

С пробелами:

.long DW.ref._ZTI14Fake_Exception - .
#                                ^^^
Т.е. это, видимо, смещение и надо делать 0x401743 + 0x190000.

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

Да не, мимо будет (0х5...)
Нашёл я символ DW.ref._ZTI14Fake_Exception, сидит по адресу 0x403044, но каким хитрым образом он закодирован в .long DW.ref._ZTI14Fake_Exception-., я не понимаю.

(gdb) x/1aw 0x403044
0x403044 <DW.ref._ZTI14Fake_Exception>: 0x402ee4 <_ZTI14Fake_Exception>
(gdb) x/1aw 0x402ee4
0x402ee4 <_ZTI14Fake_Exception>:        0x402ed8 <_ZTVN10__cxxabiv117__class_type_infoE+8>

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick
0x403044 - 0x401743 = 0x1901

Так что какая-то связь с 0x190000 может и есть. Как будто там не long. Это видимо compact EH table, но я в DWARF4 спецификации не нашёл, где оно описывается.

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

Там в общем такая ерунда была: в LSDA заголовке содержался адрес конца таблицы типов (которые catch блок ловит), странно то, что адрес равен следующему за .long DW.ref._ZTI14Fake_Exception-. + 1. И если сделать type_table[-1]+(char*)type_table = 0x1900 + 0x401748, что приводит нас к DW.ref._ZTI9Exception.

Штудирую статью по исключениям https://monoinfinito.wordpress.com/series/exception-handling-in-c/, а у меня примеры автора падают с segmentation fault из-за этой ерунды. Видимо что-то в спецификации DWARF изменилось. Статья, кстати, шикарная, правда букв многовато.

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