169 похожих чатов

Вопрос про MSVC. Не совсем про ассемблер, но похоже что

кроме фанатов ассемблера его никто не решит.
Проблема в том что MSVC2015-2022 упорно тянут из своего CRT функции _memcpy и _memset.
И если выкинуть CRT (указав явно точку входа через /ENTRY) то возникают проблемы:
Строки типа WCHAR buff1[25] = { 0 }; приводят к ошибке LNK2001 неразрешенный внешний символ _memset
Строки CopyMemory/RtlCopyMemory/memcpy - приводят к ошибке LNK2001 неразрешенный внешний символ _memcpy
На форумах аналогичные вопросы обсуждаются уже лет 10 (нагуглил по LNK2001 и _memset), но решения нет, советы типа собственную _memcpy/_memset написать, но MSVC не даёт собственные функции с такими именами подключить. #pragma intrinsic(memset, memcpy) - в x86 или x64 не работает.
Пока избавляюсь от зависимостей делая разные костыли из интринсиков (например __movsd, __stosd).
Но может кто-то знает как по простому решить эту проблему (приделать _memset и _memcpy или заставить студию брать их из ntdll например) глобально?

4 ответов

26 просмотров

Как не даёт подключить?

Кто мешает взять тот же фасм и собрать там объектник с public memset as '_memset'? Внутри хоть ntdll, хоть stosd/stosb. И уже с этим объектником линковаться вместо стандартной либы.

Евгений- Автор вопроса
s54820
Кто мешает взять тот же фасм и собрать там объектн...

Да, такое решение работает нормально, проверил. Однако это непрозрачность исходников получается. Ещё отдельные obj для 32 и 64. Ещё лишняя секция в PE (хотя можно слияние секций задать в принципе). Хотелось бы решать ситуацию какими-то командами в C, без привязки к fasm или masm. Чтобы линкер брал бы '_memset' из winapi-функций (например недокументированную memset из msvcrt.dll), а не подсовывать ему obj-файл с '_memset'

Евгений
Да, такое решение работает нормально, проверил. О...

В чём проблема отдельных .obj? Не вручную же собирать! Никакой лишней секции нет, в исходнике на фасме можно задать любое имя секции и атрибуты. Не нравится фасм — есть ml (да, masm, но он же в комплекте есть, в чём проблема-то?). Если можно msvcrt.dll, тогда вообще всё просто — сделай или возьми старую библиотеку импорта и линкуйся с ней. Ещё можно сделать old-style импорт-либу (если, конечно, они ещё поддерживаются современными компиляторами), в которой можно пихать в директорию импортов что угодно, и наружу оно будет торчать с каким угодно именем.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта