A question regarding the gcc compiler ...


 
Thread Tools Search this Thread
Top Forums Programming A question regarding the gcc compiler ...
# 1  
Old 11-28-2010
A question regarding the gcc compiler ...

It might be a simple one but I have this question bothering me for sometime.

When we do a symbol search inside the library directory (i.e. /usr/lib/*) via tools like nm; it takes a while to give us the results. However, its very quick when gcc is invoked to compile a program with the very same symbol (i.e. usually function API names etc.) when we include the relevant headers. Its not always the case with known headers. I've observed gcc picking up the correct libraries when such libraries are copied manually into the /usr/lib/ directory and its corrosponding header copied inside the directory /usr/include/.

How is this possible that gcc is able to find symbols so quickly where as nm couldn't? Even if gcc uses a database or configurations, why is that not available to nm? Atleast both are open source standard system tools.

Last edited by Praveen_218; 11-28-2010 at 01:32 PM.. Reason: Typo & some grammer ofcourse :( -- :)
# 2  
Old 11-28-2010
The short answer is that gcc builds symbol tables on the fly by parsing your code into required symbols (a "myfile".o file plus the crt1.o file (where _start() lives) ), then invoking ld against those symbols.

Try nm on a.o file.

nm has to read an ELF file, then resolve the symbols. Every entry point and variable (except those optimized away) constitutes something nm has to re-engineer. If you are on linux or have support ELF image files, then you can get the readelf utility. Try it.

Or download readelf.c and check out what nm has to deal with.

rpm: file/src/readelf.c Source File


If you ever build large database programs, example: Oracle Pro*C, you will find it takes a while to build one.
This User Gave Thanks to jim mcnamara For This Post:
# 3  
Old 12-01-2010
Hey Jim, thanks for your reply, really appreciate for your time.

However Jim, I feel, somehow I'm still at the same place and that the answer itself was my query.

If gcc can build the symbol table on the fly; how its so fast in locating the correct library?

The nm utility also does the same thing and its very slow and takes a considerable time to return back with the libraries matching in the symbol being searched?

If, incase, the gcc has a much efficient algorithm, why is that nm is yet to implement the searching logic of gcc; atlease they both are around for almost same time and both are opensource tools.
# 4  
Old 12-01-2010
So, you're trawling the entire /usr/lib/ directory? by default gcc uses these and only these:
Code:
# Compiling with -static to make it more obvious which things it uses
$ echo "main() { return(42); }" > 42.c
$ strace -f gcc -static 42.c -o 42 2> 42.log
$  grep "\.[ao]" 42.log | grep open | egrep -v "ENOENT|/tmp"
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/../../../crt1.o", O_RDONLY|O_LARGEFILE) = 4
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/../../../crti.o", O_RDONLY|O_LARGEFILE) = 5
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/crtbeginT.o", O_RDONLY|O_LARGEFILE) = 6
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/libgcc.a", O_RDONLY|O_LARGEFILE) = 8
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/libgcc_eh.a", O_RDONLY|O_LARGEFILE) = 9
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/../../../libc.a", O_RDONLY|O_LARGEFILE) = 10
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/crtend.o", O_RDONLY|O_LARGEFILE) = 11
[pid  7741] open("/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/../../../crtn.o", O_RDONLY|O_LARGEFILE) = 12

Try a library it'll have to look for, like pthread:
Code:
# Yes, I'm aware the code is nonsense.  Nothing better's needed
$ echo "main() { return(pthread_create(42)); }" > 42.c
$ gcc 42.c
/tmp/cckAe1dw.o: In function `main':
42.c:(.text+0x19): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

...It didn't find it. gcc only looks inside what it's told to look inside -- by default a very small set of libraries encompassing stdio, libc, a few math builtins, that's it. It has to be explicitly told to check in libpthread.so (or libpthread.a when linking statically) like
Code:
$ gcc -lpthread 42.c
$

So gcc never had any special superfast linker finding thing. It's just been told where to look. When you start linking in dozens of libraries, you'll indeed find gcc having to do a lot more work...
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 12-01-2010
Yes -l is required with all the shared libraries (only) and that the gcc never looks into any *.so by default. We also do provide -L flag in the makefiles for gcc to look for but it's the directory path, wherein there could be many library archieves (i.e. *.a).

Wherein we also provide a path for nm to look into, isn't it?

There were times when I've used altogather a new APIs by just looking at header files declerations and searched the relevant *.a file path to be included into the makefile. gcc was extremely quick to locate the relevant libxxx.a file (out of a number of such archieves) to add the correct library without significantly impairing the overall build time.

I was suspecting to have some kind of global symbol maintainance job by gcc (global -for given a system) with an on the fly addition (or may be deletion when the Symbol-Path combination produces error) as and when a new symbol is encountered to be linked into with the build. Which won't be dependable all the time, as otherwise that would hamper the portability of the source , but wanted to confirm that Smilie .

Last edited by Praveen_218; 12-01-2010 at 12:16 PM..
# 6  
Old 12-01-2010
Quote:
Originally Posted by Praveen_218
Wherein we also provide a path for nm to look into, isn't it?
If you don't know the library you want, gcc doesn't either. -L only tells gcc where to get files from, it still expects names given with -l for it to link anything at all. It never trawls. Of course trawling with nm is slower.
Quote:
There were times when I've used altogather a new APIs by just looking at header files declerations and searched the relevant *.a file path to be included into the makefile. gcc was extremely quick to locate the relevant libxxx.a file (out of a number of such archieves) to add the correct library without significantly impairing the overall build time.
It's still not psychic. It doesn't know that -lz means zlib, and doesn't know what symbols -lz is supposed to supply. It just knows that -lz means libz.a/libz.la/libz.so/etc. There is a 1:1 correlation between library names and library files, it doesn't have to hunt -- it already knows what it wants, which is precisely what you told it.

Meaning, if you can compile with gcc, you already know what exact file you want, which is of course more efficient than trawling hundreds of files hunting for a symbol.
# 7  
Old 12-01-2010
Thank you very much for your replies. Many things, I got to know.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

cc compiler and gcc compiler

hi, can we install gcc compiler in unix based OS(sun solar,IBM AIX,HP,etc) and also can we install sun cc compiler in AIX environment and vice versa. and more ..is linux support cc compiler regards Ajay (3 Replies)
Discussion started by: ajaysahoo
3 Replies

2. Programming

gcc compiler

Which gcc compiler release had the Arm 9 multicore support?Whether the compiler that used for the single Arm 9 core can be used for its multicore systems ? If gcc not support,please tell me which are the compilers that are available for Arm 9 multicore systems (including commerical).Whether... (0 Replies)
Discussion started by: sujith4u87
0 Replies

3. Shell Programming and Scripting

gcc compiler

I am using open suse linux. I want to install gcc compiler in my machine. I ahve checked man gcc and man cc. But it's not there. Can someone help me (4 Replies)
Discussion started by: pritish.sas
4 Replies

4. Ubuntu

gcc compiler

where to download gcc compiler for ubuntu? how to install? how to build and run "c programs"? screen shots if possible.....:b::D tutorials too:cool: (5 Replies)
Discussion started by: villanarun
5 Replies

5. Solaris

gcc compiler uninstallation

OS : UNIX SUN SOLARIS 10 I installed gcc - 3.4.2 in sun solaris 10 unix machine. But i need to install gcc 2.7.2.3 now. Do i need to uninstall gcc-3.4.2 and install gcc - 2.7.2.3 or can i directly install gcc 2.7.2.3 without uninstalling gcc 3.4.2. I used pkgadd -d command to install gcc. (3 Replies)
Discussion started by: satish@123
3 Replies

6. UNIX for Dummies Questions & Answers

gcc compiler ---querry

i am newbie my querry is if i am having a gcc compiler which has been a native build with a particular version of binutilities..then when i will use this compiler to build other packages ..then in the linking stage which linker it will use if i do not set my path. ...will it uses by default... (0 Replies)
Discussion started by: mobydick
0 Replies

7. UNIX for Dummies Questions & Answers

xl C/C++ compiler to GCC compiler

Hi, we are converting from IBM-AIX(xl c/c++ compiler) to Linux(GCC complier). As a part of this i need to change the CFLAGS. The xl c/c++ complier CFLAGS is CFLAGS := $(CDEBUG) $(PROJECT_INCLUDE_DIRS) $(COBJECT_MODE) -qcpluscmt -qmakedep -qcheck=all \ -qalign=bit_packed $(LINT_FLAGS)... (0 Replies)
Discussion started by: pbattu1
0 Replies

8. Programming

gcc compiler

i write c++ code it run perfectely with g++ compiler but same code when i compile with GCC compiler it gives linker error , followed these linker error /tmp/ccfZtXOQ.o(.text+0x22): In function `main': conf_system.cpp: undefined reference to `operator new(unsigned int)'... (5 Replies)
Discussion started by: munnu
5 Replies

9. UNIX for Dummies Questions & Answers

cc compiler / gcc

:confused: I have a question concerning gcc. IŽd like to install the gcc on my Mac OS X, but when I try to run the configure command I get the following message: floriant% ./configure ./configure: read-only variable: PWD Configuring for a powerpc-apple-darwin5.4 host. *** This configuration... (2 Replies)
Discussion started by: florian.turck
2 Replies
Login or Register to Ask a Question