gcc and the mac
June 20, 2009
Re-acquainting myself with gcc. Since the man page is extensive, I summarize some useful options.
-c : compile and assemble, don’t link
-S : compile, don’t assemble
-E : preprocess, don’t compile
-o FILE : create target named FILE
-v : print version number. Output commands used during compilation
-Wall : highest warning level
-w : turn off warning
-g : add debugging info to object (for gdb)
-p : add profiling info to object (for prof)
-pg : add profiling info to object (for gprof)
-Q : output compiler stats for each function
-O,-O1 : optimize
-O2 : optimize more
-O3 : highest optimization level
-fast : optimize for speed
-Os : optimize for size
-D NAME : for preprocessor, set macro NAME to 1
-D NAME=VALUE: set macro NAME to VALUE
-U NAME : undefine macro NAME
-I DIR : add DIR to include search path
-L IDR : add DIR to library search path
-M : output make dependencies
-l LIB : search libLIB for symbol definitions (linker)
Some oddities peculiar to the mac that I’m not used to. Here’s how to create a shared object:
gcc -c stack.c gcc -dynamiclib -o libstack.dylib -dylib stack.o
Also, the mac version of gcc appends an underscore to symbols
bash $ cat main.c
#include <stdio.h>
void
hello_world() {
printf("hello world\n");
}
int
main(int argc, char **argv) {
hello_world();
}
bash $ gcc main.c
bash $ ./a.out
hello world
bash $ nm a.out
0000200c D _NXArgc
00002008 D _NXArgv
00002000 D ___progname
00001fb4 t __dyld_func_lookup
00001000 A __mh_execute_header
00002004 D _environ
U _exit
00001fc2 T _hello_world
00001fe3 T _main
U _puts
00002010 d dyld__mach_header
00001fa0 t dyld_stub_binding_helper
00001f60 T start