Avatar billede svinth Nybegynder
09. oktober 2000 - 10:57 Der er 16 kommentarer og
1 løsning

MVC++ 6 && kodestørrelsesminimering

Hej eksperter.

Jeg har tidligere spurgt om det med programmet i sub. kunne lade sig gøre at lave mindre kode. Det lykkedes ikke nogen at svare rigtigt på det. Nu har jeg midlertid fundet et lib kaldet libctiny.lib, der ganske vist ikke har så megen funktionalitet, man som reducerer exe-fils gevaldigt. Man kan søge i MSDN på \"under the hood\" for at finde mere, lib\'et kan findes på:

http://microsoft.com/msj/1197/hood1197.htm

Nu er spørgsmålet:
Hvem kan i løbet af det næste stykke tid lave en exe-fil der fylder mindre end 12288 Bytes (mit bedste bud)? Bedste dokumenterede bud vinder. Indhold af programmet skal kun være:

void main(){return 0;}

Jeg kan hjælpe igang med at vise indholdet af min map-fil:

minimain

Timestamp is 39e1674b (Mon Oct 09 08:35:55 2000)

Preferred load address is 00400000

Start        Length    Name                  Class
0001:00000000 0000012aH .text                  CODE
0002:00000000 0000001cH .idata$5                DATA
0002:0000001c 00000014H .idata$2                DATA
0002:00000030 00000014H .idata$3                DATA
0002:00000044 0000001cH .idata$4                DATA
0002:00000060 00000064H .idata$6                DATA
0002:000000c4 00000000H .edata                  DATA
0003:00000000 00000007H .data                  DATA
0003:00000007 0000021dH .bss                    DATA

  Address        Publics by Value              Rva+Base    Lib:Object

0001:00000000      _main                      00401000 f  minimain.obj
0001:00000003      _mainCRTStartup            00401003 f  libctiny:CRT0TCON.OBJ
0001:00000020      __ConvertCommandLineToArgcArgv 00401020 f  libctiny:ARGCARGV.OBJ
0002:00000000      __imp__lstrcpyA@8          00402000    kernel32:KERNEL32.dll
0002:00000004      __imp__HeapAlloc@12        00402004    kernel32:KERNEL32.dll
0002:00000008      __imp__GetProcessHeap@0    00402008    kernel32:KERNEL32.dll
0002:0000000c      __imp__lstrlenA@4          0040200c    kernel32:KERNEL32.dll
0002:00000010      __imp__GetCommandLineA@0  00402010    kernel32:KERNEL32.dll
0002:00000014      __imp__ExitProcess@4      00402014    kernel32:KERNEL32.dll
0002:00000018      \\177KERNEL32_NULL_THUNK_DATA 00402018    kernel32:KERNEL32.dll
0002:0000001c      __IMPORT_DESCRIPTOR_KERNEL32 0040201c    kernel32:KERNEL32.dll
0002:00000030      __NULL_IMPORT_DESCRIPTOR  00402030    kernel32:KERNEL32.dll
0003:00000020      __ppszArgv                00403020    <common>

entry point at        0001:00000003

Static symbols

M.v.h. Svinth
Avatar billede jpk Nybegynder
09. oktober 2000 - 12:17 #1
Jeg går ud fra at du mener:

void main(){return;}

eller

int main(){return 0;}

eller...
Avatar billede tigerdyr Nybegynder
09. oktober 2000 - 22:29 #2
sorry, fatter ikke helt hvad du vil have os til :o(
Avatar billede svinth Nybegynder
10. oktober 2000 - 07:27 #3
Klart at det er det jeg mener.
Det jeg vil have jer og andre interesserede til, er at lave den mindst mulige exe-fil, v.h.a MVC++ 6. Den der kan lave den mindste, såvel som dokumentere sin fremgangsmåde, tager pointene.

M.v.h. Svinth.
Avatar billede jackonlinux Nybegynder
10. oktober 2000 - 20:36 #4
Spørgsmålet er så : Er MS VC++ overhovedet det bedste miljø at lave små exe-filer I?

Zeeha
-onLinux
Avatar billede svinth Nybegynder
11. oktober 2000 - 07:09 #5
Det er det afgjort ikke. GCC vil til hver en tid kunne gøre det bedre. Lidt af ideen med dette spørgsmål var i og for sig også at om man ikke kan \"snyde\" MVC++ og al dens standard windows kode. Eller finde ud af at det bare ikke er muligt!?

M.v.h. Svante
Avatar billede reficul Nybegynder
29. november 2000 - 16:22 #6
Grunden til at dit program er så stort, er at programmets sektioner bliver rundet op til nærmeste 4 kb som standard. Og eftersom der er 3 sektioner (Header, Code, Data) er den samlede størrelse 3*4kb = 12kb.

Denne kan ændres ved at tilføje /filealign:512 til link.exe parameterne (El /filealign:8, men så er det kun NT, der kan køre det)

MVH
  [ReFiCuL]
Avatar billede svinth Nybegynder
30. november 2000 - 11:38 #7
Interessant!

Dog kan kompileren ikke genkende switch\'en, og jeg kan ikke finde noget om det i hjælp.
Hvis du kan komme med en virksom løsning, er pointene dine!Jeg har prøvet med følgende switches:

/filealign:512 /ALIGN:512 /opt:nowin98
Intet virker. Har det en konsekvens at jeg sidder på et NT system?

M.v.h. Svante.
Avatar billede reficul Nybegynder
30. november 2000 - 19:48 #8
Hmmm...

Jeg kører selv Win2K og Jeg har kunne komprimere et 20 kb program til 7 kb v.h.a. /filealign:512. Dette var godt nok skrevet i assembly, men mine C++ programmer krymper da også et par kb...

MHV
  [ReFiCuL]
Avatar billede svinth Nybegynder
01. december 2000 - 07:42 #9
Jeg bruger kommandolinie kompileren, cl. Min makefil ser således ud:

cl /I. /O1 /filealign:512 /ALIGN:512 /opt:nowin98 %1 %2 %3 %4 %5 %6 %7 %8 %9 minimain.cpp libctiny.lib

, hvor minimain ser således ud:

int main(){return 0;}

Som sagt bliver hverken /filealign eller /ALIGN genkendt af kopileren, og /opt:nowin98 giver heller ingen effekt. når jeg skriver cl får jeg følgende versionsinformation:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

Skal jeg gøre andet/mere end blot at kompilere med ovenstående makefil?

M.v.h. Svante.
Avatar billede reficul Nybegynder
01. december 2000 - 08:58 #10
/Filealign og /Align er jo heller ikke compiler parameter, men linker parameter!

MVH
  [ReFiCuL]
Avatar billede svinth Nybegynder
01. december 2000 - 09:06 #11
Hvor sættes de?

M.v.h. Svante.
Avatar billede reficul Nybegynder
01. december 2000 - 20:42 #12
Under
Project -> Settings -> Link -> Project Options:

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /stack:0x80,0x80 /subsystem:windows /pdb:none /machine:I386 /out:\"Release/junk.exe\" /filealign:512
Avatar billede svinth Nybegynder
04. december 2000 - 07:33 #13
Hvad gør jeg så når jeg ikke bruger det visuelle miljø, men derimod kun commandline options?

M.v.h. Svante.
Avatar billede reficul Nybegynder
04. december 2000 - 08:03 #14
Jeg går ud fra at du bare tilføjer \"/link /filealign:512\" til cl.exe
Avatar billede svinth Nybegynder
04. december 2000 - 08:17 #15
Ok, tak! Det virker :) :)

Jeg skrev: /link /filealign:512

Det fik filen ned på 2048 bytes!? Var der ikke tre dele, altså ikke fire gange 512 bytes!? Eller også fylder kodedelen bare for meget endnu :)
I øvrigt virker /filealign:8 ikke, det troede jeg det gjorde på nt?

mapfilen ser således ud:

minimain

Timestamp is 39e1674b (Mon Oct 09 08:35:55 2000)

Preferred load address is 00400000

Start        Length    Name                  Class
0001:00000000 0000012aH .text                  CODE
0002:00000000 0000001cH .idata$5                DATA
0002:0000001c 00000014H .idata$2                DATA
0002:00000030 00000014H .idata$3                DATA
0002:00000044 0000001cH .idata$4                DATA
0002:00000060 00000064H .idata$6                DATA
0002:000000c4 00000000H .edata                  DATA
0003:00000000 00000007H .data                  DATA
0003:00000007 0000021dH .bss                    DATA

  Address        Publics by Value              Rva+Base    Lib:Object

0001:00000000      _main                      00401000 f  minimain.obj
0001:00000003      _mainCRTStartup            00401003 f  libctiny:CRT0TCON.OBJ
0001:00000020      __ConvertCommandLineToArgcArgv 00401020 f  libctiny:ARGCARGV.OBJ
0002:00000000      __imp__lstrcpyA@8          00402000    kernel32:KERNEL32.dll
0002:00000004      __imp__HeapAlloc@12        00402004    kernel32:KERNEL32.dll
0002:00000008      __imp__GetProcessHeap@0    00402008    kernel32:KERNEL32.dll
0002:0000000c      __imp__lstrlenA@4          0040200c    kernel32:KERNEL32.dll
0002:00000010      __imp__GetCommandLineA@0  00402010    kernel32:KERNEL32.dll
0002:00000014      __imp__ExitProcess@4      00402014    kernel32:KERNEL32.dll
0002:00000018      \\177KERNEL32_NULL_THUNK_DATA 00402018    kernel32:KERNEL32.dll
0002:0000001c      __IMPORT_DESCRIPTOR_KERNEL32 0040201c    kernel32:KERNEL32.dll
0002:00000030      __NULL_IMPORT_DESCRIPTOR  00402030    kernel32:KERNEL32.dll
0003:00000020      __ppszArgv                00403020    <common>

entry point at        0001:00000003

Static symbols

Vil noget kunne skæres fra?

Hvis du giver et vilkårligt svar er pointene dine :).

M.v.h. Svante.
Avatar billede reficul Nybegynder
04. december 2000 - 11:51 #16
Den gang jeg alignede til 8 bytes bruge jeg også /align:8 istedet for /filealign.8, men fik samtidig en warning, men det virkede da.

Grunden til at koden fylder mere end 512 bytes, er at et VC++ program af en eller anden skoddet grund laver en masse unødigt som diverse error checkings.

MVH
  [ReFiCuL]
Avatar billede svinth Nybegynder
05. december 2000 - 10:30 #17
Ok. Når jeg prøver får jeg en masse warnings og error og krav om at jeg rent faktisk laver en driver fil :).
Men pointene er hermed givet videre :).

M.v.h. Svinth.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester