标题:无法解析的外部符号 _WinMain@16
只看楼主
angie1123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-8-11
结帖率:0
已结贴  问题点数:20 回复次数:5 
无法解析的外部符号 _WinMain@16
#include  <stdio.h>
    int main ()
{
    printf("%d\n", sizeof (char));
    return 0 ;
 }


错误    1    error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用    C:\Users\lsuvh\Documents\Visual Studio 2013\Projects\C languange lesson\C languange lesson\MSVCRTD.lib(crtexew.obj)    C languange lesson

请问为什么提示这个, 程序有什么问题吗?请教大佬
搜索更多相关主题的帖子: 符号 Documents 解析 外部 Users 
2021-08-11 22:57
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:10 
windows project : create win32
console project : create win32 console
2021-08-12 08:16
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:0 
#include  <stdio.h>

int main(int argc, char *argv[])
{
    argv[5] = "sizeof char";
    argv[4] = "sizeof short";
    argv[3] = "sizeof int";
    argv[2] = "sizeof float";
    argv[1] = "sizeof double";
    argv[0] = "sizeof long int";
   
    char size[6] = {
        sizeof (long int),
        sizeof (double),
        sizeof (float),
        sizeof (int),
        sizeof (short),
        sizeof (char),
    };
   
    argc = 6;
    while (argc--)
        printf("%s: %c\n", argv[argc], 0x30 + size[argc]);
   
    return 0 ;
}

[此贴子已经被作者于2021-8-12 10:49编辑过]

2021-08-12 10:47
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:10 
控制台应用程序你偏要用_WinMain程序入口,链接器表示很费解。
2021-08-12 10:55
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:0 
#include <stdio.h>

int main(int argc, char *argv[])
{
    char tbl[6][12] = {
        {0x6c, 0x6f, 0x6e, 0x67, 0x20,
         0x69, 0x6e, 0x74, 0x20, 0x30 + sizeof (long int), 0},
        {0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x30 + sizeof (double), 0},
        {0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x30 + sizeof (float), 0},
        {0x69, 0x6e, 0x74, 0x20, 0x30 + sizeof (int), 0},
        {0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x30 + sizeof (short), 0},
        {0x63, 0x68, 0x61, 0x72, 0x20, 0x20, 0x30 + sizeof (char), 0}
    };

    argc = 6;
    while (argc--) {
        printf("sizeof %s\n", tbl[argc]);
    }
   
    return 0 ;
}

[此贴子已经被作者于2021-8-12 13:02编辑过]

2021-08-12 12:59
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:0 
#include <stdio.h>

#define HIWORD(_w, _bit) _w << _bit
#define DIG(_n) _n + 0x30
#define _sizeof(T) ((size_t)((T*)0 + 1))

int main(int argc, char *argv[])
{
    int tbl[6][3] = {
        0x676e6f6c, 0x746e6920, HIWORD(DIG(_sizeof (long int)), 8) | 0x20,
        0x62756f64, HIWORD(DIG(_sizeof (double)), 24) | 0x20656c, 0,
        0x616f6c66, HIWORD(DIG(_sizeof (float)), 16) | 0x2074, 0,
        0x20746e69, 0x30 + _sizeof (int), 0,
        0x726f6873, HIWORD(DIG(_sizeof (short)), 16) | 0x2074, 0,
        0x72616863, HIWORD(DIG(_sizeof (char)), 16) | 0x2020, 0,
        };

    argc = 6;
    while (argc--) {
        printf("sizeof %s\n", (char *)tbl[argc]);
    }

    return 0 ;
}

[此贴子已经被作者于2021-8-12 20:00编辑过]

2021-08-12 14:01
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
回复 6楼 自由而无用
请问printf函数的调用约定是什么,  printf函数是如何获取参数的个数的, 这种方式可能出现什么漏洞?
2021-08-12 15:58
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:0 
回复 7楼 diycai
#include <stdio.h>

#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"

int vebp, vesp;

//calling convention _cdecl glibc
int va_param(int nop, ...)
{
    __asm__ ("movl %esp, vesp");
    __asm__ ("movl %ebp, vebp");
        
    printf("esp = 0x%x\nebp = 0x%x\n", vesp, vebp);

    //non-optimized
    printf("0x%d", *(int *)(vesp+0x4));
    printf("0x%d", *(int *)(vesp+0x8));
    printf("0x%d", *(int *)(vesp+0x0C));
    printf("0x%d", *(int *)(vesp+0x10));
    printf("0x%d", *(int *)(vesp+0x14));
    //optimized
    //general register
   
    return 0;
}

int main(int argc, char *argv[])
{
    va_param(1,2,3,4,5);

    return 0;
}
2021-08-12 18:04
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
回复 8楼 自由而无用
参数个数问题怎么解决, 例如我传入 va_param(1,2,3,4,5,6);  6就无法显示,  我传入 va_param(1,2,3,4);  那就多显示了一个值。
2021-08-13 11:52
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:0 
回复 9楼 diycai
calculate param push count, then esp - ebp / sizeof(int *)
2021-08-13 12:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506485-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.317324 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved