Mit "-L<pfad>" kann man ein Verzeichnis angeben, in dem der Linker zuerst mal nach den angegebenen Bibliotheken suchen soll.
Wenn Du also die libm.so aus dem Verzeichnis /usr/freeware/lib32/ nehmen willst, schreibst Du einfach "-L/usr/freeware/lib32" vor Deine ganzen -lsonstwas.
In den "lib32"-Verzeichnissen sind Bibliotheken für n32-Executables. In denen mit einfach nur "lib" stehen normalerweise die o32-Bibliotheken.
Debuggen mit den Kommandozeilendebuggern wie dbx oder gdb ist nicht so schwierig, wie es aussieht:
"where" macht einen stack-trace und "list" zeigt die paar Zeilen um die aktuelle Position an. Mit "step" kann man eine Zeile vor, "stop at <Zeilennummer>" setzt einen Breakpoint und "run" startet den gecrashten Prozess von vorn. "help" listet alle Kommandos auf und "help <Kommando>" liefert eine Beschreibung für das Kommando.
Ein Beispiel:
bash-2.04$ dbx crasher
dbx version 7.2.1 Mar 13 1998 19:00:36
Core from signal SIGSEGV: Segmentation violation
(dbx) where
> 0 main(argc = 1, argv = 0x7fff2f24) ["/usr/people/tkrueger/data/source/crasher/crasher.c":5, 0x10000fb4]
1 __start() ["/xlv55/kudzu-apr12/work/irix/lib/libc/libc_n32_M3/csu/crt1text.s":17
7, 0x10000e50]
(dbx) list
>* 5 (*p)++;
6
7 return 0;
8 }
(dbx) print p
(nil)
Wie man sieht ist mein Programm in der Funktion "main" in Zeile 5 abgestürzt, weil es versucht hat den NULL-Zeiger p zu dereferenzieren.
Das sollte reichen, um rauszufinden, wo die Sache in die Hose geht.
Tilmann
Anhang 1: crasher.c
int main (int argc, char *argv [])
{
int *p = 0;
(*p)++;
return 0;
}
Anhang 2: Kompilierungskommando
gcc -g crasher.c -o crasher