Programming Tools gcc make utility Open Source code Static and Shared Libraries gdb Memory debugging tools GCC gcc – compile and link Compile options -o outfile -c -Dname -Idir -Ldir -lname -Wall -On -Os -g Make Utility “easy” compilation of complex programs Requires creation of a makefile Usage: make [target] Looks for Makefile or makefile or GNUMakefile. Use –f to specify a makefile filename If no target given when running make, it will use the first one. Using Make Macros Can define macros using macro=val pairs. Commonly defined macros CC OBJS CFLAGS LDLIBS Special Macros $@ - The target of this rule $< - The first dependency of this rule Suffix Rules Make has built in rules for compiling certain things based on the suffix of the file .c.o: $(CC) –c $(CFLAGS) –o $@ $< Adding custom suffixes .SUFFIXES: .dat Pattern Rules More powerful than suffix rules Can have dependencies Matches patterns provided %.o : %.c $(CC) –c $(CFLAGS) –o $@ $< Commonly Expected Targets all install uninstall clean Phony Targets Sometimes we need to specify a rule has no corresponding file Use the .PHONY directive .PHONY: target Open Source Code GNU Build System Autoconf Automake Libtool Installing Open Source Software Download the tarball tar ztvf bash.tar.gz tar zxvf bash.tar.gz tar jxvf bash.tar.bz2 Compile and install ./configure make – compile only make install – compile and install Libraries Static Libraries (lib*.a files) Collection of object (*.o) files Maintains a table of what symbols are defined by what object files Created using archiver utility ar rcs libfoo.a obj1.o obj2.o obj3.o Compiling Against Static Libraries Functions copied from library into binary during linking gcc –c –o hello.o hello.c ar rcs libhello.a hello.o gcc –Wall –c main.c –o main.o gcc –o hello main.o –L. –lhello ./hello Shared Libraries One copy of code in library that multiple programs can use Smaller programs Easier to make updates Portability issues Backward compatibility Creating Shared Libraries Position Independent Code –fPIC Don’t use –fomit-frame-pointer gcc –fPIC –c hello.c –o hello.o gcc –shared –Wl,-soname,libfoo.so.1 –o libfoo.so.1.5 hello.o Compiling Against The Shared Library System must know where to find the library. /usr/lib /lib Otherwise, add to LD_LIBRARY_PATH Define during program execution with LD_LIBRARY_PATH = /path/to/lib ./progname Compile against the library gcc main.c –o main –L. -lhello GNU Debugger (gdb) Command Line Debugger Compile program with –g flag Run program through debugger gdb progname gdb can examine core files gdb progname corefile gdb commands list / l break / b Lists lines of source code. Default is 10 lines around current address. Can specify range: l 5,10 Sets a breakpoint on a given line clear / delete Remove breakpoint(s) gdb commands (cont) run / r next / n Starts the program to be debugged running from the begging until the first breakpoint Executes the next instruction. Does not step into functions! step / s Executes the next instruction. Does step into functions! gdb commands (cont) command breakpointnum display Allows a list of commands to be run when the breakpoint is encountered Displays some value at every breakpoint undisplay Cancels the display command gdb commands (cont) print / p set Sets the value of a variable set option=10 where / w Displays the value of an expression “p option” will print the value of the variable “option” Prints a backtrace. continue / c Continues executing the program GLIBC Memory Debugging Common Problems Memory Leaks Buffer Over/Under flow Tools env variable MALLOC_CHECK_ mcheck library GLIBC Memory Debugging MALLOC_CHECK_ MALLOC_CHECK_=1 ./badmem prints any warning to stderr MALLOC_CHECK_=2 ./badmem prints warning to stderr and calls abort() GLIBC Memory Debugging mcheck Link against mcheck library gcc –g badmem.c –o badmem –lmcheck Through gdb Set breakpoint for main Add a command for that breakpoint “call mcheck(0)” “continue” In all cases, mcheck must be called before any calls to malloc! Memory Debugging Preventing overflows with “electric fence” Link with –lefence Provides new form of malloc that allocates additional space after requested space Any attempt to write to that space will cause the Kernel to kill the process with SIGSEGV Memory Debugging Tracing Memory Leaks Set env MALLOC_TRACE to a logfile Call mtrace from gdb Memory Debugging Other tools mpr – Memory allocation profiler gcov – Coverate test tool strace – Trace system calls during execution ltrace – Trace library calls during execution mtrace – Trace memory allocation valgrind – debugging suite of tools