From: Seyran A. <sey...@ta...> - 2008-09-18 18:04:35
|
Hi, I'm using gcc3.4.5 to build 32-bit shared library on Windows Vista and Which static libraries are getting linked with the output by default and how can I make them not to link to make the output (in my case a dll) as small as possible. I've tried --shared-libgcc, seems it doesn't work. Thanks, Seyran |
From: Brian D. <br...@de...> - 2008-09-20 10:03:09
|
[This is a resend. Apparently sf.net ate some list email.] Seyran Avanesyan wrote: > I'm using gcc3.4.5 to build 32-bit shared library on Windows Vista and > Which static libraries are getting linked with the output by default and > how can I make them not to link to make the output (in my case a dll) as > small as possible. Well that question really depends. Those things that are getting statically linked in contain symbols that are referenced from somewhere, otherwise they wouldn't be included. In other words, they are required. If you really want to omit them then use -nostdlib, however unless your code is 100% self-contained and does not need *any* outside help from the C runtime library, expect link-time or run-time errors. If you want to try a shared libgcc, you need to use the experimental 4.2 or 4.3 compilers. 3.4 supported static libgcc only. But I suspect that most of the code you are seeing included comes from other sources, like libmingw32.a, libmingwex.a, and the crt*.o startup code. I suggest you use the linker's map feature if you want to see exactly where everything is coming from. Here's an example: $ cat hello.c #include <stdio.h> int main() { puts("Hello world."); } $ gcc hello.c -Wl,-M 2>&1 | \ perl -ane 'print if $F[0] eq ".text" && hex($F[2]) > 0' .text 0x00401000 0xa00 .text 0x00401000 0x2e0 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../crt2.o .text 0x004012e0 0x10 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/crtbegin.o .text 0x004012f0 0x40 c:/tmp/ccAhbaaa.o .text 0x00401330 0x30 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(pseudo-reloc.o) .text 0x00401360 0x100 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(cpu_features.o) .text 0x00401460 0x10 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(CRT_fp10.o) .text 0x00401470 0x100 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(gccmain.o) .text 0x00401570 0x320 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o) .text 0x00401890 0x30 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(_chkstk.o) .text 0x004018c0 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00121.o) .text 0x004018d0 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00060.o) .text 0x004018e0 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00656.o) .text 0x004018f0 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00062.o) .text 0x00401900 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00388.o) .text 0x00401910 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00039.o) .text 0x00401920 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00642.o) .text 0x00401930 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00111.o) .text 0x00401940 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00575.o) .text 0x00401950 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00626.o) .text 0x00401960 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00533.o) .text 0x00401970 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libmsvcrt.a(dcjes00634.o) .text 0x00401980 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libkernel32.a(dwpds00155.o) .text 0x00401990 0x8 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../libkernel32.a(dwpds00736.o) .text 0x004019a0 0x10 C:/msys/1.0/mingw/bin/../lib/gcc/mingw32/3.4.5/crtend.o The third column is the size. All those 8 byte entries from import libraries (i.e. -lmsvcrt) are thunk stubs which result in a call to a function in a DLL that wasn't declared with __declspec(dllimport). As you can see the only actual code in the user's program was 0x40 bytes. The rest came from the various runtime support libraries. Brian |
From: Seyran A. <sey...@ta...> - 2008-09-22 22:45:01
|
Brian Dessent wrote: > Well that question really depends. Those things that are getting > statically linked in contain symbols that are referenced from > you can see the only actual code in the user's program was 0x40 bytes. > The rest came from the various runtime support libraries. Thanks for response! -nostdlib works perfect, but not for this case. I actually don't want to get rid of those necessary libraries, I need them to link as shared to make my output as small as possible, as there are many of them. Linker's map feature is very useful, thanks again. As I see, for example libmingwex.a is import library for several object modules which got linked if I use a function from them. Is that correct? The question is, are there shared libraries for those modules in any of gcc versions: crt*.o libmingwex.a (or for object modules it contains) libmingw32.a ( -//- ) dllcrt2.o. ... And if there are, how can I make them link as shared? There is -shared-libgcc for libgcc, what about others? What about gcc4.4.0 in particular from 64bit MinGW project. Thanks, Seyran |
From: Brian D. <br...@de...> - 2008-09-22 23:01:17
|
Seyran Avanesyan wrote: > As I see, for example libmingwex.a is import library for several object > modules which got linked if I use a function from them. Is that correct? It's not an import library, it's a static library. > The question is, are there shared libraries for those modules in any of > gcc versions: > crt*.o > libmingwex.a (or for object modules it contains) > libmingw32.a ( -//- ) > dllcrt2.o. These are all part of the MinGW runtime, not part of gcc, and so the gcc version is irrelevant. You could in theory try hacking libmingwex and libmingw32 to build as DLLs but I don't think anyone has ever expressed any desire or motivation to do that as it's antithetical to the MinGW project goals, foremost of which is to produce standalone binaries that don't require support DLLs. (Shared libgcc on the other hand is required for proper cross-library exception handling support, so that is why it is optionally supported in 4.x as it's a matter of correctness, much like the mingwm10.dll TLS destructor helper. MinGW gcc 3.x had hacky patches to support EH with static libgcc which is why no one bothered getting shared libgcc working there.) The crt startup objects are always statically linked into the executable, and you can't really change that. You could however (again in theory) modify the startup code to be just a stub and move the meat of the startup routines into a shared runtime DLL, but again that's very much not what the average MinGW audience wants so it's never been done, AFAIK. Brian |