在没有 kernel32.lib 的情况下编译 c 程序时出现链接错误

问题描述

我想创建只使用 ntdll 并对其进行安全检查的应用程序。但是当我删除 kernel32.lib 或取消选中“从父项或项目认值继承”时,我在构建项目时会收到​​链接错误Link Errors

#include <Windows.h>
#include <processthreadsapi.h>
#include <vcruntime.h>
ULONG WINAPI NtGetCurrentProcessorNumber(void);
void main()
{
    int a = 2;
    int b = 5;
    int sum = a + b;
    int Number = NtGetCurrentProcessorNumber();
    while (1)
    {

    }
}

void NtProcessstartup(PVOID DriverObject,PVOID RegistryPath)
{
    __security_init_cookie();
    //__security_check_cookie();
    main();
}

这是一个本地项目,当我在编译器设置中删除“安全检查”开关并删除“__security_init_cookie”功能时工作正常。这个项目链接到 ntdll.lib

有人可以帮我吗?

解决方法

当您使用安全检查时,__security_xx 函数会链接到您的模块。链接器错误表明 gs_support.obj__security_xx 函数所在的位置)需要 QueryPerformanceCounter 和 其他列出的功能。 QueryPerformanceCounter resides in kernel32,因此在使用安全检查时需要与其链接。