| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3178 人关注过本帖
标题:想要一个纯DOS的编译器
只看楼主 加入收藏
zsl99a
Rank: 1
等 级:新手上路
帖 子:5
专家分:5
注 册:2012-12-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:15 
想要一个纯DOS的编译器
我以前用过 C-Free 编译的程序最小就 6K 不到 ,百度说是 gcc 编译器 可是我下了 ,几行代码编译的程序有48K 那么大 ,一个木马也大不了多少啊 ,找了很多办法不行啊  ,不知有没有大神有优化到位的编译器 ,给俺个  ,要纯dos的  ,编译的程序要小 ,可以在win7下运行的
搜索更多相关主题的帖子: 百度 编译器 
2012-12-23 20:53
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:5 
int main(void) { return 0; }

这段代码,gcc编译器生成的可执行文件有16KB。cl微软的编译器在开启最小化空间(/01)的参数下生成的可执行文件有36KB,所以gcc要好一点。

My life is brilliant
2012-12-23 21:05
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
不知道你想要的是程序小 还是要在纯DOS运行

TC是纯DOS的罢 编译的肯定是纯DOS程序

如果要程序小呢 有很多办法 改编译参数啦 加压缩壳啦 相对来说 Visual C++也就是微软的编译器在控制文件大小方面做的好 毕竟PE格式是微软发明的

至于病毒木马大小么 呵呵 现在的病毒很多都上M了。。。。
2012-12-23 21:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
VC编译出来release版的.exe最小是8K,不知哪来的那么大。

授人以渔,不授人以鱼。
2012-12-23 21:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用lz1091914999在2012-12-23 21:05:02的发言:

int main(void) { return 0; }
 
这段代码,gcc编译器生成的可执行文件有16KB。cl微软的编译器在开启最小化空间(/01)的参数下生成的可执行文件有36KB,所以gcc要好一点。

VS2008里 类似的代码 Release编译 大小是

图片附件: 游客没有浏览图片的权限,请 登录注册

2012-12-23 21:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
改改对齐神马的能更小 不过现在我一般都加upx壳了 比那么麻烦的改参数容易多了。。
2012-12-23 21:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
#include <clocale>
#include <cstdio>
#include "my_tools.h"
#include "my_console.h"

void wmain(void)
{
    _wsetlocale(LC_ALL, L"chs");

    myConsole::SetTitle("Test");
    myConsole::SetTextAttribute(myConsole::TEXT_GREEN | myConsole::TEXT_RED | myConsole::TEXT_INTENSITY, myConsole::TEXT_BLUE);
    myConsole::Clear();

    FILE* file;
    errno_t error = _wfopen_s(&file, L"20121201.txt", L"rt");
    if (error == 0)
    {
        wchar_t buffer[BUFSIZ];
        while (!feof(file))
        {
            fgetws(buffer, BUFSIZ, file);
            wprintf_s(L"%s", buffer);
        }
        fclose(file);
    }
    else
    {
        wprintf_s(L"文件打开失败");
    }

    myConsole::GotoXY(0, 24);
    Pause("按任意键继续...");
}


上面这个程序的Debug版是20K,Release版是8K:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2012-12-23 21:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
gcc对这个问题的处理肯定不行 开源圈对微软的东西不感兴趣 文件大小牵扯PE文件等东西 貌似很多相关的bug都懒得修复

但gcc是个好东西 最大的好处是跨平台而且免费。。
2012-12-23 21:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VC编译的.exe文件小,是因为它实际上调用的是VC运行库.DLL,大量的函数不是在.exe中的,而gcc编译出来的.exe是把所有用到的机器码都嵌入在.exe中。那是传统的内嵌本机代码,一切可执行码都在一个文件中,亦即两个.exe用到printf()函数,那么printf()函数的可执行码就有两份,分别占用磁盘空间,而使用动态运行库的程序,只有一份printf()可执行码存在于磁盘上。在安装时,一次过把VC的运行库都放在磁盘上,看起来占了很多空间,不及传统用多少抽取多少包装的文件小,但却忘记了如果有大量这种程序的话,累计起来占用的磁盘空间就远远超过动态运行库只占一次那些了,何况,如果某个公共函数改码,就必须所有发行程序都跟着重新发行一次。

授人以渔,不授人以鱼。
2012-12-23 21:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-12-23 21:30:10的发言:

VC编译的.exe文件小,是因为它实际上调用的是VC运行库.DLL,大量的函数不是在.exe中的,而gcc编译出来的.exe是把所有用到的机器码都嵌入在.exe中。那是传统的内嵌本机代码,一切可执行码都在一个文件中,亦即两个.exe用到printf()函数,那么printf()函数的可执行码就有两份,分别占用磁盘空间,而使用动态运行库的程序,只有一份printf()可执行码存在于磁盘上。在安装时,一次过把VC的运行库都放在磁盘上,看起来占了很多空间,不及传统用多少抽取多少包装的文件小,但却忘记了如果有大量这种程序的话,累计起来占用的磁盘空间就远远超过动态运行库只占一次那些了,何况,如果某个公共函数改码,就必须所有发行程序都跟着重新发行一次。
程序代码:
//gcc -Wall a.c
#include <stdio.h>

int main(void)
{
    printf("gcc没你想的那么笨\n");
    return 0;
}


004013B0    55              PUSH EBP
004013B1    89E5            MOV EBP,ESP
004013B3    83E4 F0         AND ESP,FFFFFFF0
004013B6    83EC 10         SUB ESP,10
004013B9    E8 D2050000     CALL a.00401990
004013BE    C70424 64304000 MOV DWORD PTR SS:[ESP],a.00403064        ; gcc没你想的那么笨
004013C5    E8 36080000     CALL <JMP.&msvcrt.puts>
004013CA    B8 00000000     MOV EAX,0
004013CF    C9              LEAVE
004013D0    C3              RETN

00401BF8  - FF25 28614000   JMP DWORD PTR DS:[<&msvcrt.signal>]      ; msvcrt.signal
00401BFE    90              NOP
00401BFF    90              NOP
00401C00  - FF25 24614000   JMP DWORD PTR DS:[<&msvcrt.puts>]        ; msvcrt.puts
00401C06    90              NOP
00401C07    90              NOP
00401C08  - FF25 1C614000   JMP DWORD PTR DS:[<&msvcrt.fwrite>]      ; msvcrt.fwrite

77C118D5 >  6A 18           PUSH 18
77C118D7    68 0047BE77     PUSH msvcrt.77BE4700
77C118DC    E8 3F5BFFFF     CALL msvcrt.77C07420
77C118E1    834D E0 FF      OR DWORD PTR SS:[EBP-20],FFFFFFFF
77C118E5    BE A0FCC277     MOV ESI,msvcrt.77C2FCA0
77C118EA    56              PUSH ESI
77C118EB    6A 01           PUSH 1
77C118ED    E8 22A0FFFF     CALL msvcrt.77C0B914
77C118F2    59              POP ECX
77C118F3    59              POP ECX


win平台下C是调用的微软的运行时的

可执行模块, 条目 1
 基址=77BE0000
 大小=00058000 (360448.)
 入口=77BEF2A1 msvcrt.<模块入口点>
 名称=msvcrt   (系统)
 文件版本=7.0.2600.5512 (xpsp.080413-2111
 路径=C:\WINDOWS\system32\msvcrt.dll


2012-12-23 21:42
快速回复:想要一个纯DOS的编译器
数据加载中...
 
   



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

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