Mail Archives: cygwin/2007/04/24/20:45:31
On 25 April 2007 00:19, Ray Hurst wrote:
> Brian Dessent wrote:
>> In the case of Cygwin, the C library is provided by Cygwin, in the form
>> of cygwin1.dll. Cygwin relies on newlib to implement some things, but
>> malloc is not one of them.
> Technically you are correct. gcc does not care. However, gcc is
> typically used to invoke the linker which does care where the C library
> is. Most command lines that use gcc to compile and link do not specify
> where the C library is as gcc or the linker knows where it is.
>
> What I am asking is how do these programs find the C library on a cygwin
> system running on windows? Specifically. I am looking for the library
> that contains the malloc function but I would like the general info also.
Take a look at the output from "gcc -v" when compiling and linking a "Hello
World":
--------------------------------<snip!>--------------------------------
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure
--verbose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--enable-languages=c,ada,c++,d,f77,pascal,java,objc --enable-nls
--without-included-gettext --enable-version-specific-runtime-libs --without-x
--enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter
--disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm
--disable-win32-registry --enable-sjlj-exceptions
--enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
/usr/lib/gcc/i686-pc-cygwin/3.4.4/cc1.exe -quiet -v -D__CYGWIN32__
-D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../include/w3
2api -idirafter
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../../include
/w32api hello.c -quiet -dumpbase hello.c -mtune=pentiumpro -auxbase hello
-version -o /win/c/DOCUME~1/dk/LOCALS~1/Temp/ccccycor.s
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/include
/usr/include
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../include/w3
2api
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../../include
/w32api
End of search list.
GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
(i686-pc-cygwin)
compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd
0.125).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/as.exe -o
/win/c/DOCUME~1/dk/LOCALS~1/Temp/cc8gFoYM.o
/win/c/DOCUME~1/dk/LOCALS~1/Temp/ccccycor.s
--------------------------------<snip!>--------------------------------
This is the interesting bit: the linker commandline.
--------------------------------<snip!>--------------------------------
/usr/lib/gcc/i686-pc-cygwin/3.4.4/collect2.exe -Bdynamic
--dll-search-prefix=cyg -o hello.exe
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/crt0.o
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/usr/lib/gcc/i686-pc-cygwin/3.4.4
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../..
/win/c/DOCUME~1/dk/LOCALS~1/Temp/cc8gFoYM.o -lgcc -lcygwin -luser32 -lkernel32
-ladvapi32 -lshell32 -lgcc
--------------------------------<snip!>--------------------------------
Gcc just supplies the relevant search paths for the libraries. The standard
system libraries to link against are this bit:
--------------------------------<snip!>--------------------------------
-lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
--------------------------------<snip!>--------------------------------
Where do they come from? Look at the start of the output again:
--------------------------------<snip!>--------------------------------
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
--------------------------------<snip!>--------------------------------
That's the specs file. Specs are an internal set of options that gcc uses
to specify how to parse a commandline and pass options on to the substages
(preprocessing, compilation, assembly, linking) of the whole process: see
section 3.15, "Specifying subprocesses and the switches to pass to them" in
"info gcc" for more detail. The stuff it contains is actually built-in to the
gcc compile driver as well. Look at the output of "gcc --help":
--------------------------------<snip!>--------------------------------
/tmp $ gcc --help
Usage: gcc [options] file...
Options:
-pass-exit-codes Exit with highest error code from a phase
--help Display this information
--target-help Display target specific command line options
(Use '-v --help' to display command line options of sub-processes)
-dumpspecs Display all of the built in spec strings
-dumpversion Display the version of the compiler
-dumpmachine Display the compiler's target processor
-print-search-dirs Display the directories in the compiler's search
path
-print-libgcc-file-name Display the name of the compiler's companion
library
-print-file-name=<lib> Display the full path to library <lib>
-print-prog-name=<prog> Display the full path to compiler component <prog>
-print-multi-directory Display the root directory for versions of libgcc
-print-multi-lib Display the mapping between command line options
and
multiple library search directories
-print-multi-os-directory Display the relative path to OS libraries
-Wa,<options> Pass comma-separated <options> on to the assembler
-Wp,<options> Pass comma-separated <options> on to the
preprocessor
-Wl,<options> Pass comma-separated <options> on to the linker
-Xassembler <arg> Pass <arg> on to the assembler
-Xpreprocessor <arg> Pass <arg> on to the preprocessor
-Xlinker <arg> Pass <arg> on to the linker
-save-temps Do not delete intermediate files
-pipe Use pipes rather than intermediate files
-time Time the execution of each subprocess
-specs=<file> Override built-in specs with the contents of <file>
-std=<standard> Assume that the input sources are for <standard>
-B <directory> Add <directory> to the compiler's search paths
-b <machine> Run gcc for target <machine>, if installed
-V <version> Run gcc version number <version>, if installed
-v Display the programs invoked by the compiler
-### Like -v but options quoted and commands not
executed
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
-x <language> Specify the language of the following input files
Permissible languages include: c c++ assembler none
'none' means revert to the default behavior of
guessing the language based on the file's extension
Options starting with -g, -f, -m, -O, -W, or --param are automatically
passed on to the various sub-processes invoked by gcc. In order to pass
other options on to these processes the -W<letter> options must be used.
For bug reporting instructions, please see:
<URL:http://cygwin.com/problems.html>.
@_______. .
( /"\
||--||(___)
'" '"'---'
/tmp $
--------------------------------<snip!>--------------------------------
It's the various -print* and -dump* ones that are interest. Take a look at
the specs:
--------------------------------<snip!>--------------------------------
/tmp $ gcc -dumpspecs 2>&1 | tee -a gcc.log
*asm:
*asm_debug:
%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}
*asm_final:
*asm_options:
%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}
*invoke_as:
%{!S:-o %|.s |
as %(asm_options) %m.s %A }
*cpp:
%(cpp_cpu) %{posix:-D_POSIX_SOURCE} %{mno-win32:%{mno-cygwin: %emno-cygwin
and mno-win32 are not compatible}} %{mno-cygwin:-D__MSVCRT__ -D__MINGW32__
%{!ansi:%{mthreads:-D_MT}}} %{!mno-cygwin:-D__CYGWIN32__ -D__CYGWIN__
%{!ansi:-Dunix} -D__unix__ -D__unix } %{mwin32|mno-cygwin:-DWIN32 -D_WIN32
-D__WIN32 -D__WIN32__ %{!ansi:-DWINNT}}
%{!nostdinc:%{!mno-win32|mno-cygwin:-idirafter ../include/w32api%s -idirafter
../../include/w32api%s}}
*cpp_options:
%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}
%{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*}
%{undef}
*cpp_debug_options:
%{d*}
*cpp_unique_options:
%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet}
%{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}
%{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}
%{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{remap} %{g3:-dD} %{H} %C
%{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}}
*trad_capable_cpp:
cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}
*cc1:
%(cc1_cpu)
*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}
%1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip
%*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w}
%{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef}
%{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help}
%{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*}
*cc1plus:
*link_gcc_c_sequence:
%G %L %G
*endfile:
*link:
%{mwindows:--subsystem windows} %{mconsole:--subsystem console}
%{shared: %{mdll: %eshared and mdll are not compatible}} %{shared: --shared}
%{mdll:--dll} %{static:-Bstatic} %{!static:-Bdynamic} %{shared|mdll: -e
%{mno-cygwin:_DllMainCRTStartup AT 12} %{!mno-cygwin:__cygwin_dll_entry AT 12}}
%{!mno-cygwin:--dll-search-prefix=cyg}
*lib:
%{pg:-lgmon} %{!mno-cygwin:-lcygwin}
%{mno-cygwin:%{mthreads:-lmingwthrd} -lmingw32} %{mwindows:-lgdi32
-lcomdlg32} -luser32 -lkernel32 -ladvapi32 -lshell32
*libgcc:
%{mno-cygwin: %{mthreads:-lmingwthrd} -lmingw32} -lgcc
%{mno-cygwin:-lmoldname -lmingwex -lmsvcrt}
*startfile:
%{shared|mdll: %{mno-cygwin:dllcrt2%O%s}} %{!shared: %{!mdll:
%{!mno-cygwin:crt0%O%s} %{mno-cygwin:crt2%O%s} %{pg:gcrt0%O%s}}}
*switches_need_spaces:
*cross_compile:
0
*version:
3.4.4
*multilib:
. ;
*multilib_defaults:
*multilib_extra:
*multilib_matches:
*multilib_exclusions:
*multilib_options:
*linker:
collect2
*link_libgcc:
%D
*md_exec_prefix:
*md_startfile_prefix:
*md_startfile_prefix_1:
*startfile_prefix_spec:
*sysroot_suffix_spec:
*sysroot_hdrs_suffix_spec:
*cc1_cpu:
%{!mtune*: %{m386:mtune=i386 %n`-m386' is deprecated. Use `-march=i386' or
`-mtune=i386' instead.
} %{m486:-mtune=i486 %n`-m486' is deprecated. Use `-march=i486' or
`-mtune=i486' instead.
} %{mpentium:-mtune=pentium %n`-mpentium' is deprecated. Use `-march=pentium'
or `-mtune=pentium' instead.
} %{mpentiumpro:-mtune=pentiumpro %n`-mpentiumpro' is deprecated. Use
`-march=pentiumpro' or `-mtune=pentiumpro' instead.
} %{mcpu=*:-mtune=%* %n`-mcpu=' is deprecated. Use `-mtune=' or '-march='
instead.
}} %<mcpu=* %{mpni:-msse3 %n`-mpni' is deprecated. Use `-msse3' instead.
} %{mno-pni:-mno-sse3 %n`-mno-pni' is deprecated. Use `-mno-sse3' instead.
} %{mintel-syntax:-masm=intel %n`-mintel-syntax' is deprecated. Use
`-masm=intel' instead.
} %{mno-intel-syntax:-masm=att %n`-mno-intel-syntax' is deprecated. Use
`-masm=att' instead.
}
*mingw_include_path:
i686-pc-cygwin
*link_command:
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %{pie:-pie} %X
%{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}
%{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o
%{fprofile-arcs|fprofile-generate:-lgcov}
%{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}}
%{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}
--------------------------------<snip!>--------------------------------
This is the pertinent one:
--------------------------------<snip!>--------------------------------
*lib:
%{pg:-lgmon} %{!mno-cygwin:-lcygwin}
%{mno-cygwin:%{mthreads:-lmingwthrd} -lmingw32} %{mwindows:-lgdi32
-lcomdlg32} -luser32 -lkernel32 -ladvapi32 -lshell32
--------------------------------<snip!>--------------------------------
You can look up the docs I mentioned above to see how it works, but I guess
you can probably see that it's the sort of thing that might be responsible for
causing
-lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
to appear. (The compiler prefixes and suffixes the list with -lgcc twice
automatically).
So, now you know where the linker is told to search, and what for. Most of
this is specified when the compiler is configured for a cygwin system. If you
wanted to play with it, you could make a copy of the default specs file, hack
it about, and get gcc to make use of it by the -specs=<file> commandline
option.
The final piece of the jigsaw? You know it links against cygwin1.dll, you
know it searchs in /usr/lib, so let's take a look at the symbols defined
there:
/tmp $ nm /usr/lib/libcygwin.a | grep '__imp__'
and there, amongst many many others, you will see:
00000000 I __imp__lroundf
00000000 I __imp__lsearch
00000000 I __imp__lutimes
00000000 I __imp__mallinfo
00000000 I __imp__malloc
00000000 I __imp__malloc_stats
00000000 I __imp__malloc_trim
00000000 I __imp__malloc_usable_size
00000000 I __imp__mallopt
00000000 I __imp__matherr
00000000 I __imp__mblen
00000000 I __imp__mbrlen
00000000 I __imp__mbrtowc
00000000 I __imp__mbsinit
so, it gets malloc imported from cygwin1.dll. There is no way to know from
the sight of the symbol whether it was originally from newlib or whether
cygwin supplied its own; that's the point at which you have to start checking
the sources to know. (Though as Brian says, it's from cygwin.)
cheers,
DaveK
--
Can't think of a witty .sigline today....
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -