| Thread overview |
|---|
May 01, 2005 big file... | ||||
|---|---|---|---|---|
| ||||
just curious as to why this file is so large... D:\jam>cat a.c #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { int i = GetCurrentProcessId(); printf("i = %d\n",i); return 0; } D:\jam>dmc -WA -6 -o+all a.c link a,,,user32+kernel32/noi; D:\jam>ls -al a.exe -rwxrwxrwx 1 user group 39964 Apr 30 23:02 a.exe is there an easy way to "strip" an executable? | ||||
May 01, 2005 Re: big file... | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Anuj Goyal | There's nothing to strip. Your call to printf() guarantees you linkage to the C runtime library, and that's around 40K IIRC.
You could try
WriteFile(GetStdHandle(STD_HANDLE_OUTPUT), "Hello", 5, . . .
(may have the syntax wrong)
If you want low footprint integer to string conversions, use STLSoft's integer_to_string, as in:
/* STLSoft Header Files */
#include <stlsoft.h>
#include <stlsoft_integer_to_string.h>
/* Standard C Header Files */
#include <windows.h>
/* Standard C++ Header Files */
/*
//////////////////////////////////////////////////////////////////////////
*/
int main(int /* argc */, char ** /*argv*/)
{
DWORD pid = ::GetCurrentProcessId();
char sz[21];
size_t n;
char const *s = ::stlsoft::integer_to_string(sz, 21,
(__int32)pid, n);
DWORD dummy;
::WriteFile(::GetStdHandle(STD_OUTPUT_HANDLE), s, n, &dummy,
NULL);
return 0;
}
/*
//////////////////////////////////////////////////////////////////////////
*/
That compiles and builds to 2048 bytes with VC++ 7.1.
(You need the __int32 because of a bug - soon to be fixed! - in the STLSoft libs.)
"Anuj Goyal" <Anuj_member@pathlink.com> wrote in message news:d51rkp$20sp$1@digitaldaemon.com...
> just curious as to why this file is so large...
>
> D:\jam>cat a.c
> #include <stdio.h>
> #include <stdlib.h>
> #include <windows.h>
>
> int main()
> {
> int i = GetCurrentProcessId();
> printf("i = %d\n",i);
> return 0;
> }
>
>
> D:\jam>dmc -WA -6 -o+all a.c
> link a,,,user32+kernel32/noi;
>
>
> D:\jam>ls -al a.exe
> -rwxrwxrwx 1 user group 39964 Apr 30 23:02 a.exe
>
> is there an easy way to "strip" an executable?
>
>
| |||
May 01, 2005 Re: big file... | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew | Matthew wrote:
> There's nothing to strip. Your call to printf() guarantees you linkage to the C runtime library, and that's around 40K IIRC.
>
> That compiles and builds to 2048 bytes with VC++ 7.1.
Interesting.
What is the exact command line you have used ?
Are you using VC++ Professional Version (with optimisations) ?
I have the 2003 Standard Version which does not permit optimisations.
| |||
May 02, 2005 Re: big file... | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew | "Matthew" <admin@stlsoft.dot.dot.dot.dot.org> wrote in message news:d51vdf$23uo$2@digitaldaemon.com... > That compiles and builds to 2048 bytes with VC++ 7.1. Probably because you're linking to the VC runtime DLL. | |||
May 02, 2005 Re: big file... | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter Attachments: | Puh-lease! Give me some credit. See attached DepencyViewer, and if you don't believe that, run the exe. ;-) "Walter" <newshound@digitalmars.com> wrote in message news:d548u4$p3u$1@digitaldaemon.com... > > "Matthew" <admin@stlsoft.dot.dot.dot.dot.org> wrote in message news:d51vdf$23uo$2@digitaldaemon.com... >> That compiles and builds to 2048 bytes with VC++ 7.1. > > Probably because you're linking to the VC runtime DLL. > > | |||
May 02, 2005 Re: big file... | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew | Oops sorry for the huge bmp. I should've made it smaller. :$ btw, I'm sure I could have got smaller than 2048, as I'm aware that there are various packing / packaging options for doing so. (not off the top of my head, of course.) "Matthew" <admin@stlsoft.dot.dot.dot.dot.org> wrote in message news:d54a7t$qr0$1@digitaldaemon.com... > Puh-lease! Give me some credit. > > See attached DepencyViewer, and if you don't believe that, run the exe. ;-) > > > > "Walter" <newshound@digitalmars.com> wrote in message news:d548u4$p3u$1@digitaldaemon.com... >> >> "Matthew" <admin@stlsoft.dot.dot.dot.dot.org> wrote in message news:d51vdf$23uo$2@digitaldaemon.com... >>> That compiles and builds to 2048 bytes with VC++ 7.1. >> >> Probably because you're linking to the VC runtime DLL. >> >> > > > | |||
May 02, 2005 Re: big file... ( DMC can shrink it too ) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew | Matthew wrote: > > btw, I'm sure I could have got smaller than 2048, as I'm aware that there are various packing / packaging options for doing so. (not off the top of my head, of course.) > Hi Matthew, You choose to ignore my post :-) Of course that's ok. It did probably upset you. Because the question in it was two fold: 1) i really wanted to know how you did it. But as you ignored my post, i decided to do some research by myself. 2) I think the merit for the small size exe must be credited the the fact that the linker do 50% of the job and the other 50% comes from the fact that the called functions are available in kernel32.dll. And i was asking you to illustrate that to me. So in order to come clean with you, i do offer my apology, now, without conditions. If i dont come clean with you, i am, at least clean with BOB. >>>> That compiles and builds to 2048 bytes with VC++ 7.1. I have done some test with VC++ 6.0, and the best i got was 800 bytes with the following program: #include <windows.h> #ifdef __DMC__ int _acrtused_con; #endif int main( ) { static char buf[21]; wsprintf(buf,"pid: %d",(int)GetCurrentProcessId()); WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), buf, lstrlen(buf), NULL, NULL ); return 0; } but now, we must use two dll: user32 and kernel32. The good news, the same result, can almost be be achieved with DMC. The following command: dmc -NL -o+all 10.c /L/entry:_main do produce a 3200 bytes exe. Strangely, this exe *can* compressed, by UPX, to the smallest size i got: 2048 bytes, and still being a valid executable. Ok, case closed (well, i guess). Cheers. Sammy | |||
May 02, 2005 Re: big file... ( DMC can shrink it too ) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sammy | "Sammy" <Sammy.Deroy@sympatico.ca> wrote in message news:d55fv9$1tp0$1@digitaldaemon.com... > #include <windows.h> > #ifdef __DMC__ > int _acrtused_con; > #endif > > int main( ) > { > static char buf[21]; > wsprintf(buf,"pid: %d",(int)GetCurrentProcessId()); > WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), > buf, lstrlen(buf), NULL, NULL ); > return 0; > } > > but now, we must use two dll: user32 and kernel32. > > The good news, the same result, can almost be be achieved with DMC. > > The following command: > dmc -NL -o+all 10.c /L/entry:_main > do produce a 3200 bytes exe. I never thought of doing that! Pretty cool, and my congratulations. | |||
May 02, 2005 Re: big file... ( DMC can shrink it too ) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sammy | Sammy wrote: > Matthew wrote: > >> >> btw, I'm sure I could have got smaller than 2048, as I'm aware that there are various packing / packaging options for doing so. (not off the top of my head, of course.) >> > > Hi Matthew, > > You choose to ignore my post :-) > Of course that's ok. > > It did probably upset you. > Because the question in it was two fold: > > 1) i really wanted to know how you did it. > But as you ignored my post, i decided to do > some research by myself. > > 2) I think the merit for the small size exe > must be credited the the fact that the linker > do 50% of the job and the other 50% comes > from the fact that the called functions are > available in kernel32.dll. And i was asking you > to illustrate that to me. > > So in order to come clean with you, i do offer > my apology, now, without conditions. > > If i dont come clean with you, i am, at least > clean with BOB. > > >>>> That compiles and builds to 2048 bytes with VC++ 7.1. > > I have done some test with VC++ 6.0, and the best i got > was 800 bytes with the following program: > > #include <windows.h> > #ifdef __DMC__ > int _acrtused_con; > #endif > > int main( ) > { > static char buf[21]; > wsprintf(buf,"pid: %d",(int)GetCurrentProcessId()); > WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), > buf, lstrlen(buf), NULL, NULL ); > return 0; > } Try: #include <stdlib.h> char buf [ 24 ]; ltoa ( GetCurrentProcessId (), buf, 10 ); WriteFile ( GetStdHandle ( STD_OUTPUT_HANDLE ), buf, lstrlen ( buf ), 0, 0 ); > > but now, we must use two dll: user32 and kernel32. > > The good news, the same result, can almost be be achieved > with DMC. > > The following command: > dmc -NL -o+all 10.c /L/entry:_main > do produce a 3200 bytes exe. > > Strangely, this exe *can* compressed, by UPX, > to the smallest size i got: 2048 bytes, and > still being a valid executable. > > Ok, case closed (well, i guess). > > Cheers. > > Sammy > > > > > -- ManiaC++ Jan Knepper But as for me and my household, we shall use Mozilla... www.mozilla.org | |||
May 02, 2005 Re: big file... ( DMC can shrink it too ) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jan Knepper | Jan Knepper wrote: > > Try: > #include <stdlib.h> > > char buf [ 24 ]; > ltoa ( GetCurrentProcessId (), buf, 10 ); > WriteFile ( GetStdHandle ( STD_OUTPUT_HANDLE ), buf, lstrlen ( buf ), 0, 0 ); > You suggest to use ltoa( ) instead of wsprintf( ). That gives an ever smaller exe (2588 bytes, see below). You still needs windows.h. Looks like stdlib.h did not pull in the DMC runtime. /* 11.c */ #include <windows.h> #include <stdlib.h> int _acrtused_con=0; int main( ) { char buf[ 24 ]; ltoa(GetCurrentProcessId( ),buf,10); _lwrite((int)GetStdHandle(-11L),buf,lstrlen(buf)); return 0; } Compiled with: dmc -NL -o+all 11.c /L/entry:_main snn.lib gives: 2005-05-02 18:43 PM 2,588 11.exe This exe depends only on kernel32.dll and ntdll.dll. Undocumented ntdll.dll contains a lot of functions ( like ltoa ). if we could have an import library for it, DMC could be use to build tiny executables. There is a 'tinylibc' librairie on the net which is used to produce tiny exe. It could probably work with DMC. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply