FreeSource: AltLinux/Sisyphus/devel/TypicalPackagingErrors/LinkingError

Эта страница была перенесена на altlinux.org. Текст на freesource.info заморожен.

--as-needed

На этой странице планируется собирать полезную для майнтейнеров информацию, связанную с ошибками сборки из-за --as-needed.

Из архива почтовой рассылки devel@:


Original Message
Subject: Re: [devel] --as-needed

Date: Mon, 6 Mar 2006 16:22:03 +0300

From: Dmitry V. Levin <ldv@altlinux>

To: ALT Devel discussion list <devel@lists.altlinux>

Вот несколько искусственный пример, полученный

путём усушки реального случая:

$ cat zv.c

#include <zlib.h>

int main(void) { return !zlibVersion(); }

$ gcc -c zv.c

$ ld --as-needed --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o zv /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i586-alt-linux/3.4.4/crtbegin.o -L / usr / lib / gcc / i 586-alt-linux/3.4.4 -L/usr/lib zv.o -lz -lc /usr/lib/gcc/i586-alt-linux/3.4.4/crtend.o /usr/lib/crtn.o

$ ld --as-needed --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o zv /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i586-alt-linux/3.4.4/crtbegin.o -L / usr / lib / gcc / i 586-alt-linux/3.4.4 -L/usr/lib -lz zv.o -lc /usr/lib/gcc/i586-alt-linux/3.4.4/crtend.o /usr/lib/crtn.o

zv.o: In function `main':zv.c:(.text+0x23): undefined reference to `zlibVersion'

Первый ld отличается от второго порядком файлов:

в первом “zv.o -lz”, во втором “-lz zv.o”.

Такое поведение ld не является ошибкой, в режиме --as-needed порядок может

повлиять на значение: если библиотека (здесь -lz) следует до первого

пользователя (здесь zv.o), то в режиме --as-needed оно будет убрано как

ненужное.


Original Message
Subject: Re: [devel] --as-needed

Date: Mon, 6 Mar 2006 18:56:11 +0300

From: Dmitry V. Levin <ldv@altlinux>

To: ALT Devel discussion list <devel@lists.altlinux>

>>> >Первый ld отличается от второго порядком файлов:
>>> > в первом “zv.o -lz”, во втором “-lz zv.o”.
>>> >
>>> > Такое поведение ld не является ошибкой, в режиме --as-needed порядок может
>>> > повлиять на значение: если библиотека (здесь -lz) следует до первого
>>> > пользователя (здесь zv.o), то в режиме --as-needed оно будет убрано как
>>> > ненужное.
>
>>
>> Собственно, со статическими библиотеками так всегда и было (только ещё
>> хуже – могла вытащиться часть, которой потом не хватало для остального).

В том то и дело: --as-needed просто делает работу со динамическими

библиотеками аналогичной работе со статическими библиотеками.


Original Message
Subject: Re: [devel] --as-needed

Date: Tue, 7 Mar 2006 08:06:38 +0300

From: Andrey Rahmatullin <wrar-alt@mail>

To: devel@lists.altlinux

>> Меньше всех, разумеется, пострадали KDEшные пакеты, и то с редкими
>> именами. :)

Если бы во всех около-КДЕшных пакетах был нормальный (новый) admin/, давно

можно было бы всем им (попробовать) сделать --enable-new-ldflags,

добавляющий --as-needed ;)

См. konversation.


Original Message
Subject: Re: [devel] --as-needed

Date: Tue, 7 Mar 2006 12:30:53 +0300

From: Dmitry V. Levin <ldv@altlinux.>

To: ALT Devel discussion list <devel@lists.altlinux>

>>> > Первый ld отличается от второго порядком файлов:
>>> > в первом “zv.o -lz”, во втором “-lz zv.o”.
>
>> Ага. И такое может сгенерить и automake. И генерит.
>>
>> Вход:
>> bin_PROGRAMS = mpdscribble
>> mpdscribble_SOURCES = mpdscribble.c as.c conn.c escape.c file.c lmc.c \
>> md5.c misc.c as.h conn.h escape.h file.h lmc.h md5.h misc.h
>> AM_CFLAGS="-I./libmpdclient”
>> AM_LDFLAGS="./libmpdclient/libmpdclient.o”

Не надо имена библиотек указывать в LDFLAGS.

Для этого в automake предусмотрены другие средства (LDADD).


Original Message
Subject: Re: [devel] --as-needed

Date: Tue, 14 Mar 2006 13:31:24 +0300

From: Dmitry V. Levin <ldv@altlinux>

To: ALT Devel discussion list <devel@lists.altlinux>

> Кстати, а это нововведение в апстриме? В смысле можно этим агументировать
> необходимость пересмотра порядка библиотек при подготовке багрепортов для
> апстримов других пакетов ?

Да, ld --as-needed руализован больше года назад и есть в последнем

стабильном выпуске ld (не только для linux).

Повторюсь, изменение порядка библиотек, которое приходится делать

дляисправления линковки с --as-needed, автоматически исправляет линковку

со статическими библиотеками. Для некоторых upstream'ов это тоже может

быть аргументом.


Original Message
Subject: Re: [devel] --as-needed

Date: Sat, 18 Mar 2006 22:06:45 +0300

From: Dmitry V. Levin <ldv@altlinux>

To: ALT Devel discussion list <devel@lists.altlinux>

Обнаружилась ещё одна типичная проблема, которую легко понять на

приведённом ниже простом примере:

$ cat libfoo1.c

int foo1(void) { return 0; }

$ cat libfoo2.c

extern int foo1(void);

int foo2(void) { return foo1(); }

$ cat foo3.c

extern int foo2(void);

int main(void) { return foo2(); }

$ gcc -Wall -fpic -shared libfoo1.c -o libfoo1.so

$ gcc -Wall -fpic -shared libfoo2.c -o libfoo2.so -L. -lfoo1

$ gcc -Wall foo3.c -o foo3 -L. -lfoo2

/usr/bin/ld: warning: libfoo1.so, needed by ./libfoo2.so, not found (try using -rpath or -rpath-link)

./libfoo2.so: undefined reference to `foo1'

collect2: ld returned 1 exit status

$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -Wl,-rpath-link,.

Тонкость в том, что раньше ещё и так работало (хоть и ругалось):

$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -lfoo1

/usr/bin/ld: warning: libfoo1.so, needed by ./libfoo2.so, not found (try using -rpath or -rpath-link)

А теперь так не работает:

$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -lfoo1

/usr/bin/ld: warning: libfoo1.so, needed by ./libfoo2.so, not found (try using -rpath or -rpath-link)

./libfoo2.so: undefined reference to `foo1'

collect2: ld returned 1 exit status

Это bugfix, см. http://sourceware.org/ml/binutils/2006-03/msg00259.html

Так что надо будет постепенно всё это зафиксить и за'upstream'ить.

Ссылки

Страницы, ссылающиеся на данную: AltLinux/Sisyphus/devel/TypicalPackagingErrors