TypicalPackagingErrors/LinkingError
Материал из ALT Linux Wiki
(Различия между версиями)
(Import from freesource.info) |
Ender (обсуждение | вклад) |
||
Строка 8: | Строка 8: | ||
=== Из архива почтовой рассылки devel@: === | === Из архива почтовой рассылки devel@: === | ||
- | ---- Original Message ---- | + | ---- Original Message ---- |
- | Subject: Re: [devel] --as-needed | + | Subject: Re: [devel] --as-needed |
- | Date: Mon, 6 Mar 2006 16:22:03 +0300 | + | Date: Mon, 6 Mar 2006 16:22:03 +0300 |
- | From: Dmitry V. Levin <ldv@altlinux> | + | From: Dmitry V. Levin <ldv@altlinux> |
- | To: ALT Devel discussion list <devel@lists.altlinux> | + | To: ALT Devel discussion list <devel@lists.altlinux><br> |
+ | Вот несколько искусственный пример, полученный | ||
+ | путём усушки реального случая:<br> | ||
+ | $ 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 -[[TypicalPackagingErrors/L/usr/lib/gcc/i586|i586]]-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 -[[TypicalPackagingErrors/L/usr/lib/gcc/i586|i586]]-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'<br> | ||
+ | Первый ld отличается от второго порядком файлов: | ||
+ | в первом "zv.o -lz", во втором "-lz zv.o".<br> | ||
+ | Такое поведение 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><br> | ||
+ | >>>>Первый ld отличается от второго порядком файлов: | ||
+ | >>> > в первом "zv.o -lz", во втором "-lz zv.o". | ||
+ | >>> > | ||
+ | >>> > Такое поведение ld не является ошибкой, в режиме --as-needed порядок может | ||
+ | >>> > повлиять на значение: если библиотека (здесь -lz) следует до первого | ||
+ | >>> > пользователя (здесь zv.o), то в режиме --as-needed оно будет убрано как | ||
+ | >>> > ненужное. | ||
+ | >>> | ||
+ | >> Собственно, со статическими библиотеками так всегда и было (только ещё | ||
+ | >> хуже - могла вытащиться часть, которой потом не хватало для остального).<br> | ||
+ | В том то и дело: --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шные пакеты, и то с редкими >> именами. :)<br> | |
- | + | Если бы во всех около-КДЕшных пакетах был нормальный (новый) admin/, давно | |
+ | можно было бы всем им (попробовать) сделать --enable-new-ldflags, | ||
+ | добавляющий --as-needed ;) | ||
+ | См. konversation. | ||
- | Первый ld отличается от второго порядком файлов: | + | ---- Original Message ---- |
- | в первом "zv.o -lz", во втором "-lz zv.o". | + | 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><br> | ||
+ | >>> > Первый 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"<br> | ||
+ | Не надо имена библиотек указывать в 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><br> | ||
+ | > Кстати, а это нововведение в апстриме ? В смысле можно этим агументировать | ||
+ | > необходимость пересмотра порядка библиотек при подготовке багрепортов для | ||
+ | > апстримов других пакетов ?<br> | ||
+ | Да, ld --as-needed руализован больше года назад и есть в последнем | ||
+ | стабильном выпуске ld (не только для linux).<br> | ||
+ | Повторюсь, изменение порядка библиотек, которое приходится делать | ||
+ | дляисправления линковки с --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><br> | |
- | + | Обнаружилась ещё одна типичная проблема, которую легко понять на | |
- | + | приведённом ниже простом примере:<br> | |
- | + | $ 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(); }<br> | |
- | + | $ gcc -Wall -fpic -shared libfoo1.c -o libfoo1.so | |
- | + | $ gcc -Wall -fpic -shared libfoo2.c -o libfoo2.so -L. -lfoo1 | |
- | ---- Original Message ---- | + | $ 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,.<br> | |
- | + | Тонкость в том, что раньше ещё и так работало (хоть и ругалось): | |
- | + | $ 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)<br> | |
- | + | А теперь так не работает: | |
- | + | $ 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<br> | |
- | + | Это bugfix, см. [http://sourceware.org/ml/binutils/2006-03/msg00259.html http://sourceware.org/ml/binutils/2006-03/msg00259.html] | |
- | Subject: Re: [devel] --as-needed | + | Так что надо будет постепенно всё это зафиксить и за'upstream'ить. |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | 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 http://sourceware.org/ml/binutils/2006-03/msg00259.html] | + | |
- | Так что надо будет постепенно всё это зафиксить и за'upstream'ить. | + | |
=== Ссылки === | === Ссылки === | ||
* [[UpStream/AsNeeded|AsNeeded]] | * [[UpStream/AsNeeded|AsNeeded]] |
Версия 20:13, 4 сентября 2008
--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 -i586-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 -i586-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'ить.