powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / ABI динамических библиотек
25 сообщений из 29, страница 1 из 2
ABI динамических библиотек
    #40039463
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039485
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется short всегда был 16 разрядным. Это int может плавать.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039492
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКажется short всегда был 16 разрядным.

Вопрос не в его собственной разрядности, а в том как он передаётся в функции динамических
библиотек с соглашением stdcall на платформах в 32 и 64 разряда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039493
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonКажется short всегда был 16 разрядным.

Вопрос не в его собственной разрядности, а в том как он передаётся в функции динамических
библиотек с соглашением stdcall на платформах в 32 и 64 разряда.

Основной вопрос: накуа вы это делаете?

Ну и побочные вопросы:

- Алгоритм выравнивания аргументов при упаковке в стек.
- И как они (аргументы) копируются в стек.

Тут нужно читать стандарт. Но я не вижу оснований при копировании в стек поднимать short до int.
Не думаю, что это всё вообще имеет смысл обсуждать.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039515
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Можно полагаться на системное ABI.

AFAIK там никаких short int нет

https://en.wikipedia.org/wiki/X86_calling_conventions
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039532
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?
Выравнивание ABI гарантирует, следующие параметры не поедут. А вот старшие биты... Тут может зависеть от компилятора
Код: plaintext
1.
2.
3.
void __stdcall foo(short int);
extern short x[2];
void test() { foo(x[1]); }

gcc и clang выдают что-то такое
Код: plaintext
1.
2.
3.
4.
	pushl	%eax
	movswl	_x+2, %eax
	movl	%eax, (%esp)
	calll	foo
movswl - загрузка в регистр с расширением знака.
А вот у borland C по-другому
Код: plaintext
1.
2.
3.
	mov       ax,word ptr [_x+2]
	push      eax
	call      foo
и тут в старших битах кажется остался мусор.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039583
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?

Приложение в точке вызова положит в стек то, что описано в точке вызова. "приложение, её использующее со значением -1" - если за этим стоит нормальный вызов "foo(short int)" то в стек должны пойти 2 байта, а если их читать функцией "foo(unsigned int)" то она возьмет из стека 4 байта. Но, по идее GetProcAddress должен не найти foo(short int) и до вызова не дойдет.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039632
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravОсновной вопрос: накуа вы это делаете?

Разработка новой версии библиотеки с расширенным функционалом, но сохранением обратной
совместимости как на уровне исходников, так и двоичной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039633
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надежнее сделать два билд-скрипта. Чтоб собирались фолдеры типa x86, x64 для каждой разрядности.

Ну а в приложении набить "гвоздей" макросами.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039636
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложения чужие, в них ничего не набьёшь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039664
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609
Dimitry Sibiryakov

Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?

Приложение в точке вызова положит в стек то, что описано в точке вызова. "приложение, её использующее со значением -1" - если за этим стоит нормальный вызов "foo(short int)" то в стек должны пойти 2 байта, а если их читать функцией "foo(unsigned int)" то она возьмет из стека 4 байта. Но, по идее GetProcAddress должен не найти foo(short int) и до вызова не дойдет.
Вот только бред писать не надо, ни в зуб ногой в теме
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039686
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
Dimitry Sibiryakov

Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?
Выравнивание ABI гарантирует, следующие параметры не поедут.

А если в аргументах только N аргументов типа short и всё, то они все выровняются по границе sizeof(int)?
Всё что меньше int выравнивается в стеке по sizeof(int)?
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039734
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravОсновной вопрос: накуа вы это делаете?

Разработка новой версии библиотеки с расширенным функционалом, но сохранением обратной
совместимости как на уровне исходников, так и двоичной.

А следующим шагом захочется добавить ещё один аргумент. А для старой программы, которая не
знает об этом аргументе, использовать значение по умолчанию. И придётся писать промежуточную
DLL, которая будет типы преобразовывать и значения по умолчанию подставлять.

Я бы сразу писал эту прокси-DLL. Мог бы переупорядочить аргументы под новые мысле-пожелания.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039745
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вспомнилось, есть в WinAPI (GDI) одна волшебная функция. Сигнатура у неё упрощённо такая:

Код: plaintext
1.
void MyFunc(MY_STRUCT *);


При этом в структуре MY_STRUCT первое поле — это размер структуры типа UINT. Этот размер структуры
является по совместительству идентификатором типа структуры. Туда можно подставить другую структуру
типа MY_STRUCT_EX. Во талант костыли прикручивать, я был очень удивлён.

Вопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым полем
прописали размер структуры? Ну понятно, что для некоторой дополнительной безопасности. Но… эээ.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039749
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сравнивать с указателями.

Вместо HANDLE сложнее впихнуть другой HANDLE. Ну тоесть использовать имеющийся можешь,
а создать новый хендл - через специальный API.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039752
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Если сравнивать с указателями.

Вместо HANDLE сложнее впихнуть другой HANDLE. Ну тоесть использовать имеющийся можешь,
а создать новый хендл - через специальный API.

HANDLE — это указатель (или индекс) на структуру в памяти ядра ОС. Я уверен там штатно записан тип
этого дескриптора, а не размер как тип. Это немного другое. Это не костыль. В моём примере была
обычная структура клиентского кода.

Впрочем, HANDLE как некая универсальная штука, которая ссылается на всё что угодно тоже смотрится
диковато. Как-то неправильно…
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039755
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravВопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039757
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.

Если бы эти люди думали наперёд, то они бы в первом поле структуры прописали бы идентификатор типа
структуры, а не воспринимали бы потом размер структуры как id. В том то и дело.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039762
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.

Кроме того мой пример — это исключение в проектировании WinAPI. Обычно они имеют функцию аля ::CreateRemoteThread(), а потом
добавляют функцию ::CreateRemoteThreadEx(). Т.е. это был явный костыль, а не думанье наперёд.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Впрочем, HANDLE как некая универсальная штука, которая ссылается на всё что угодно тоже смотрится
диковато. Как-то неправильно…

Почему неправильно?
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039777
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravКроме того мой пример — это исключение в проектировании WinAPI.

Значит ты просто с ним совсем не знаком. Там такую структуру имеет каждая вторая структура
если не первая. Размер работает лучше идентификатора версии поскольку даже структуру
неизвестной версии функция может корректно обработать. Например, сериализовать и переслать
кому-нибудь другому.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039783
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravКроме того мой пример — это исключение в проектировании WinAPI.

Значит ты просто с ним совсем не знаком.
Очень может быть.

Dimitry Sibiryakov
Там такую структуру имеет каждая вторая структура
если не первая.

Размер структуры в первом поле действительно часто используется в WinAPI. Но редко как идентификатор.
Например, в ::CreateProcess() я вижу совсем другую логику, хотя размер структуры там присутствует.

Dimitry Sibiryakov
Размер работает лучше идентификатора версии поскольку даже структуру
неизвестной версии функция может корректно обработать. Например, сериализовать и переслать
кому-нибудь другому.

И часто функции WinAPI могут принять структуру неизвестного размера, потом не распознав её они обязаны её
куда-то переслать или сереализовать? Например, ::CreateProcess() не распознал структуру, но зато её сериализовал и
переслал. И типа всё круто? Гибкость же.

Вы перепутали идентификацию, проверку размера и целепологание.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039788
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravКроме того мой пример — это исключение в проектировании WinAPI.

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

+1

Мысль интересная. Это похоже на процессинг XML, когда вы встретили новый неизвестный тег
но не упали с ошибкой а спокойно поскипали и пошли дальше.

Это кстати очень хорошо согласуется с философией сетевых протоколов. Быть маскимально
консервативным при сериализации и максимально либеральным при парсинге.
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039811
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ABI динамических библиотек
    #40039849
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dimitry Sibiryakov

пропущено...

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

+1

Мысль интересная. Это похоже на процессинг XML, когда вы встретили новый неизвестный тег
но не упали с ошибкой а спокойно поскипали и пошли дальше.

Это кстати очень хорошо согласуется с философией сетевых протоколов. Быть маскимально
консервативным при сериализации и максимально либеральным при парсинге.

Угу... Тут мы не можем ничего скипать и идти спокойно дальше. Программа должна работать
корректно, а не как получится.

То что размер структуры используется что бы повысить вероятность обнаружения сбоя — это понятно.
Костылём является использование размера как идентификатора. Вот в ::CreateProcess() такого
косяка нет, там действительно люди подумали заранее.

MSDNlpStartupInfo

A pointer to a STARTUPINFO or STARTUPINFOEX structure.

To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / ABI динамических библиотек
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]