[devel] Re: slatec, fortran libraries, weak symbols

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Ноя 29 15:51:59 MSK 2004


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 пока не помогает.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20041129/1a68da38/attachment-0001.bin>


Подробная информация о списке рассылки Devel