LINUX.ORG.RU

История изменений

Исправление 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
вызов то по факту «виртуальный». и таких .got и .plt по всей проге после загрузки десятки. Вот линковка этих таблиц и тормозит старт сложных плюсовых прог

А ведь можно просто добавить экспортную версию 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
вызов то по факту «виртуальный». и таких .got и .plt по всей проге после загрузки десятки. Вот линковка этих таблиц и тормозит старт сложных плюсовых прог

А ведь можно просто добавить экспортную версию vtable где виртуальными будут все методы, и даже статические функции будут «виртуальными». И экспортировать один символ на класс. Ибо что так 2 чтения(из plt и из got), что по новой читать указатель на vtable и прыгать прямо туда. Только указатель на vtable компилятор может скэшировать в стеке а got и plt хрен скешируешь.


jmp