On Mon, Nov 29, 2004 at 04:25:31PM +0500, Constantin Mikhaylenko wrote: > Почитал. понял свою ошибку. > Поймал вашу. Надо: > gcc -shared -o lib%name.so.%version -Wl,-soname=lib%name.so.%version *.o > > А фортран просто не умеет делать библиотеки. Не совсем так. g77, как и gcc -- это просто интерфейс к настоящему препроцессору, компилятору, ассемблеру, линкеру и т.д. В этом смысле и Си не умеет делать библиотеки. $ strace -kqfF -e trace=execve -- g77 -c src/acosh.f execve("/usr/bin/g77", ["g77", "-c", "src/acosh.f"], [/* 49 vars */]) = 0 execve("/usr/bin/ccache", ["i586-alt-linux-g77", "-c", "src/acosh.f"], [/* 49 vars */]) = 0 execve("/usr/bin/i586-alt-linux-g77", ["/usr/bin/i586-alt-linux-g77", "-c", "src/acosh.f"], [/* 50 vars */]) = 0 [pid 23788] --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [pid 23788] execve("/usr/lib/gcc-lib/i586-alt-linux/3.3.3/f771", ["/usr/lib/gcc-lib/i586-alt-linux/"..., "src/acosh.f", "-quiet", "-dumpbase", "acosh.f", "-auxbase", "acosh", "-o", "/home/at/tmp/cco93o9G.s"], [/* 52 vars */]) = 0 --- SIGCHLD (Child exited) @ 0 (0) --- [pid 23789] --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [pid 23789] execve("/home/at/bin/as", ["as", "-Qy", "-o", "acosh.o", "/home/at/tmp/cco93o9G.s"], [/* 52 vars */]) = -1 ENOENT (No such file or directory) [pid 23789] execve("/bin/as", ["as", "-Qy", "-o", "acosh.o", "/home/at/tmp/cco93o9G.s"], [/* 52 vars */]) = -1 ENOENT (No such file or directory) [pid 23789] execve("/usr/bin/as", ["as", "-Qy", "-o", "acosh.o", "/home/at/tmp/cco93o9G.s"], [/* 52 vars */]) = 0 --- SIGCHLD (Child exited) @ 0 (0) --- $ Здесь видно, что g77 на самом деле вызывает f771 (наподобие cc1) и /usr/bin/as. (А также видно, что ccache не умеет кэшировать фортран). $ strace -kqfF -e trace=execve -- g77 -shared -o libacosh.so.4 -Wl,-soname=libacosh.so.4 acosh.o execve("/usr/bin/g77", ["g77", "-shared", "-o", "libacosh.so.4", "-Wl,-soname=libacosh.so.4", "acosh.o"], [/* 49 vars */]) = 0 execve("/usr/bin/ccache", ["i586-alt-linux-g77", "-shared", "-o", "libacosh.so.4", "-Wl,-soname=libacosh.so.4", "acosh.o"], [/* 49 vars */]) = 0 execve("/usr/bin/i586-alt-linux-g77", ["/usr/bin/i586-alt-linux-g77", "-shared", "-o", "libacosh.so.4", "-Wl,-soname=libacosh.so.4", "acosh.o"], [/* 50 vars */]) = 0 [pid 23800] --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [pid 23800] execve("/usr/lib/gcc-lib/i586-alt-linux/3.3.3/collect2", ["/usr/lib/gcc-lib/i586-alt-linux/"..., "--eh-frame-hdr", "-m", "elf_i386", "-shared", "-o", "libacosh.so.4", "/usr/lib/gcc-lib/i586-alt-linux/"..., "/usr/lib/gcc-lib/i586-alt-linux/"..., "-L/usr/lib/gcc-lib/i586-alt-linu"..., "-L/usr/lib/gcc-lib/i586-alt-linu"..., "-soname=libacosh.so.4", "acosh.o", "-lfrtbegin", "-lg2c", "-lm", ...], [/* 54 vars */]) = 0 [pid 23801] --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [pid 23801] execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_i386", "-shared", "-o", "libacosh.so.4", "/usr/lib/gcc-lib/i586-alt-linux/"..., "/usr/lib/gcc-lib/i586-alt-linux/"..., "-L/usr/lib/gcc-lib/i586-alt-linu"..., "-L/usr/lib/gcc-lib/i586-alt-linu"..., "-soname=libacosh.so.4", "acosh.o", "-lfrtbegin", "-lg2c", "-lm", ...], [/* 55 vars */]) = 0 [pid 23800] --- SIGCHLD (Child exited) @ 0 (0) --- --- SIGCHLD (Child exited) @ 0 (0) --- $ А здесь видно, как на самом деле вызывается /usr/bin/ld c аргументом -soname. А также видно, что g77 дает указание линкеру подцепить библиотеки -lfrtbegin и -lg2c, чего не сделал бы gcc (в результате появились бы undefined symbols). По аналогии g++ -shared *.o неявно линкует с -lstdc++. > Не то, чтобы должен... > в man ld сказано, что это _облегчает_ (видимо следует читать -- ускоряет) вызов библиотеки. > > > > Давно хотел собрать slatec. > > > Если сильно не возражаете -- на этой неделе сделаю > > > (более менее свободен). > > Надо понимать -- возражаете? ;) Нет. Сам сомневаюсь. И непонятно пока, что делать с DGVEC и проч, #prgma weak пока не помогает.