Size: a a a

2020 August 20

С

Слава in rust_offtopic
Constantine Drozdov
Ну ленивые сиглтоны в блоке нулей это какое-то безумие
Я не про тот блок нулей, с которого всё началось, а про ленивую инициализацию вообще.
источник

EG

Emmanuel Goldstein in rust_offtopic
Слава
Хотите холиварную тему?

Я не читал 300 сообщений про буфер на стеке. Но представим, что буфер у нас таки есть, или он образуется при первом вызове и далее переиспользуется. То есть нечто вроде Lazy<Buffer> buffer.

А ведь при каждом обращении к этому буферу будет происходить проверка, может это самый первый вызов и нам надо его инициализировать. Между тем, после инициализации буфера можно было бы модифицировать сам код проверки, поставив туда безусловный переход или nop, или нечто вроде.

Что-то подобное умеет делать JVM-оптимизатор. А вот в языках без VM я что-то не помню возможностей языка переписывать сам исполняемый код во время исполнения.
А зря, потому что такая возможность есть.
источник

MB

Mikail Bagishov in rust_offtopic
Слава
Да примерно все современные операционные системы этому мешают. Страница помечена как execute, а write в неё делать нельзя.
источник

EG

Emmanuel Goldstein in rust_offtopic
И используется.
источник

CD

Constantine Drozdov in rust_offtopic
Слава
Я не про тот блок нулей, с которого всё началось, а про ленивую инициализацию вообще.
Ну не очень понятно, зачем это так делать
источник

EG

Emmanuel Goldstein in rust_offtopic
Используется в каком-то типе релокаций.
источник

С

Слава in rust_offtopic
Emmanuel Goldstein
Используется в каком-то типе релокаций.
Эммм. Не понимаю, о чём именно речь.
источник

EG

Emmanuel Goldstein in rust_offtopic
Первый вызов функций идёт через таблицу, дальнейшие напрямую.
источник

EG

Emmanuel Goldstein in rust_offtopic
Сейчас найду конкретику.
источник

CD

Constantine Drozdov in rust_offtopic
Слава
Я не про тот блок нулей, с которого всё началось, а про ленивую инициализацию вообще.
Отложить быструю инициализацию это скорее отрицательный, чем положительный эффект
источник

С

Слава in rust_offtopic
Constantine Drozdov
Отложить быструю инициализацию это скорее отрицательный, чем положительный эффект
Так она не всегда нужна. У нас есть баланс между уже инициализацией всего при старте, что увеличивает время старта, либо инициализацией при первом использовании.
источник

CD

Constantine Drozdov in rust_offtopic
Слава
Так она не всегда нужна. У нас есть баланс между уже инициализацией всего при старте, что увеличивает время старта, либо инициализацией при первом использовании.
Время старта намного более резиновое
источник

EG

Emmanuel Goldstein in rust_offtopic
Слава
Эммм. Не понимаю, о чём именно речь.
Jump slot.
источник

С

Слава in rust_offtopic
Трамплин?
источник

EG

Emmanuel Goldstein in rust_offtopic
ХЗ как на русском
Я об этом узнал из вот этой статьи
https://fasterthanli.me/series/making-our-own-executable-packer/part-11
источник

С

Слава in rust_offtopic
В любом случае, спасибо
источник

EG

Emmanuel Goldstein in rust_offtopic
Если функция лениво динамически ищется, то она это делает один раз.
источник

EG

Emmanuel Goldstein in rust_offtopic
Потом «функция» _dl_runtime_resolve_xsave переписывает адрес на правильный
источник

EG

Emmanuel Goldstein in rust_offtopic
Слава
В любом случае, спасибо
https://gist.github.com/GoldsteinE/0c21f710332e4b6d6bd01cd37821c916
Другой пример
Можно заметить, что функция resolve_get_msg вызывается один раз.
источник

D

Dima in rust_offtopic
Emmanuel Goldstein
https://gist.github.com/GoldsteinE/0c21f710332e4b6d6bd01cd37821c916
Другой пример
Можно заметить, что функция resolve_get_msg вызывается один раз.
не сочтите за  приебон но насколько я знаю можно же как-то более явно объявлять указатели на функции
typedef void atexit_function ( void ) ;
// Two equivalent definitions of the same type , which hides a pointer
typedef atexit_function * atexit_function_pointer ;
typedef void (* atexit_function_pointer ) ( void ) ;
// Five equivalent declarations for the same function
void atexit ( void f ( void ) ) ;
void atexit ( void (* f ) ( void ) ) ;
void atexit ( atexit_function f ) ;
void atexit ( atexit_function * f ) ;
void atexit ( atexit_function_pointer f ) ;
источник