История изменений
Исправление
ckotinko,
(текущая версия)
:
на самом деле, С++ ABI придумали долбозвери. Сишный API предполагает подмену функций при динамической линковке через LD_PRELOAD. а с++ный класс хрен подменишь. тогда вообще не чего было сохранять совместимость для приплюснутых символов.
Кроме того, есть еще одна фича. Пусть есть класс Foo. в нем невиртуальный метод bar(). класс и его код сидят в библиотеке libfoo.so. как вызывается Foo::bar()? а тупо в приложение вставлен код
.text
call _Foo_barololololl123
.section .plt
_Foo_barololololl123:
jmp [.plt+ptr_to_real_Foo_barololololl123]
.section .got
ptr_to_real_Foo_barololololl123:long 0
А ведь можно просто добавить экспортную версию vtable где виртуальными будут все методы, и даже статические функции будут «виртуальными». И экспортировать один символ на класс. Ибо что так 2 чтения(из plt и из got), что по новой читать указатель на vtable и прыгать прямо туда. Только указатель на vtable компилятор может скэшировать в стеке а got и plt хрен скешируешь.
Исходная версия
ckotinko,
:
на самом деле, С++ ABI придумали долбозвери. Сишный API предполагает подмену функций при динамической линковке через LD_PRELOAD. а с++ный класс хрен подменишь. тогда вообще не чего было сохранять совместимость для приплюснутых символов.
Кроме того, есть еще одна фича. Пусть есть класс Foo. в нем невиртуальный метод bar(). класс и его код сидят в библиотеке libfoo.so. как вызывается Foo::bar()? а тупо в приложение вставлен код
.text
call _Foo_barololololl123
.section .plt
_Foo_barololololl123:
jmp [.plt+ptr_to_real_Foo_barololololl123]
.section .got
ptr_to_real_Foo_barololololl123:long 0
А ведь можно просто добавить экспортную версию vtable где виртуальными будут все методы, и даже статические функции будут «виртуальными». И экспортировать один символ на класс. Ибо что так 2 чтения(из plt и из got), что по новой читать указатель на vtable и прыгать прямо туда. Только указатель на vtable компилятор может скэшировать в стеке а got и plt хрен скешируешь.
jmp