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 ответов

15 просмотров

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

Кто мешает взять тот же фасм и собрать там объектник с 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 импорт-либу (если, конечно, они ещё поддерживаются современными компиляторами), в которой можно пихать в директорию импортов что угодно, и наружу оно будет торчать с каким угодно именем.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта