TypicalPackagingErrors/LinkingError

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Import from freesource.info)
Строка 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>
 +
&gt;&gt;&gt;&gt;Первый ld отличается от второго порядком файлов:
 +
&gt;&gt;&gt; > в первом "zv.o -lz", во втором "-lz zv.o".
 +
&gt;&gt;&gt; >
 +
&gt;&gt;&gt; > Такое поведение ld не является ошибкой, в режиме --as-needed порядок может
 +
&gt;&gt;&gt; > повлиять на значение: если библиотека (здесь -lz) следует до первого
 +
&gt;&gt;&gt; > пользователя (здесь zv.o), то в режиме --as-needed оно будет убрано как
 +
&gt;&gt;&gt; > ненужное.
 +
&gt;&gt;&gt;
 +
&gt;&gt; Собственно, со статическими библиотеками так всегда и было (только ещё
 +
&gt;&gt; хуже - могла вытащиться часть, которой потом не хватало для остального).<br>
 +
В том то и дело: --as-needed просто делает работу со динамическими
 +
библиотеками аналогичной работе со статическими библиотеками.
-
$ cat zv.c
+
---- Original Message ----
-
#include <zlib.h>
+
Subject: Re: [devel] --as-needed
-
int main(void) { return !zlibVersion(); }
+
Date: Tue, 7 Mar 2006 08:06:38 +0300
-
$ gcc -c zv.c
+
From: Andrey Rahmatullin <wrar-alt@mail>
-
$ 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
+
To: devel@lists.altlinux
-
$ 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
+
&gt;&gt; Меньше всех, разумеется, пострадали KDEшные пакеты, и то с редкими &gt;&gt; именами. :)<br>
-
zv.o: In function `main':zv.c:(.text+0x23): undefined reference to `zlibVersion'
+
Если бы во всех около-КДЕшных пакетах был нормальный (новый) 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>
 +
&gt;&gt;&gt; > Первый ld отличается от второго порядком файлов:
 +
&gt;&gt;&gt; > в первом "zv.o -lz", во втором "-lz zv.o".
 +
&gt; &gt;&gt; Ага. И такое может сгенерить и automake. И генерит.
 +
&gt;&gt;
 +
&gt;&gt; Вход:
 +
&gt;&gt; bin_PROGRAMS = mpdscribble
 +
&gt;&gt; mpdscribble_SOURCES = mpdscribble.c as.c conn.c escape.c file.c lmc.c \
 +
&gt;&gt;  md5.c misc.c as.h conn.h escape.h file.h lmc.h md5.h misc.h &gt;&gt; AM_CFLAGS="-I./libmpdclient"
 +
&gt;&gt; AM_LDFLAGS="./libmpdclient/libmpdclient.o"<br>
 +
Не надо имена библиотек указывать в LDFLAGS.
 +
Для этого в automake предусмотрены другие средства (LDADD).
-
Такое поведение ld не является ошибкой, в режиме --as-needed порядок может
+
---- Original Message ----
-
повлиять на значение: если библиотека (здесь -lz) следует до первого
+
Subject: Re: [devel] --as-needed
-
пользователя (здесь zv.o), то в режиме --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>
 +
&gt; Кстати, а это нововведение в апстриме ? В смысле можно этим агументировать
 +
&gt; необходимость пересмотра порядка библиотек при подготовке багрепортов для
 +
&gt; апстримов других пакетов ?<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
-
---- Original Message ----
+
From: Dmitry V. Levin <ldv@altlinux>
-
Subject: Re: [devel] --as-needed
+
To: ALT Devel discussion list <devel@lists.altlinux><br>
-
Date: Mon, 6 Mar 2006 18:56:11 +0300
+
Обнаружилась ещё одна типичная проблема, которую легко понять на
-
From: Dmitry V. Levin <ldv@altlinux>
+
приведённом ниже простом примере:<br>
-
To: ALT Devel discussion list <devel@lists.altlinux>
+
$ cat libfoo1.c  
-
  &gt;&gt;&gt; >Первый ld отличается от второго порядком файлов: &gt;&gt;&gt; > в первом "zv.o -lz", во втором "-lz zv.o". &gt;&gt;&gt; >  &gt;&gt;&gt; > Такое поведение ld не является ошибкой, в режиме --as-needed порядок может &gt;&gt;&gt; > повлиять на значение: если библиотека (здесь -lz) следует до первого &gt;&gt;&gt; > пользователя (здесь zv.o), то в режиме --as-needed оно будет убрано как &gt;&gt;&gt; > ненужное. &gt; &gt;&gt;  &gt;&gt; Собственно, со статическими библиотеками так всегда и было (только ещё &gt;&gt; хуже - могла вытащиться часть, которой потом не хватало для остального).
+
int foo1(void) { return 0; }
-
 
+
$ cat libfoo2.c
-
 
+
extern int foo1(void);
-
В том то и дело: --as-needed просто делает работу со динамическими
+
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
-
Subject: Re: [devel] --as-needed
+
/usr/bin/ld: warning: libfoo1.so, needed by ./libfoo2.so, not found (try using -rpath or -rpath-link)
-
Date: Tue, 7 Mar 2006 08:06:38 +0300
+
./libfoo2.so: undefined reference to `foo1'
-
From: Andrey Rahmatullin <wrar-alt@mail>
+
collect2: ld returned 1 exit status
-
To: devel@lists.altlinux
+
$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -Wl,-rpath-link,.<br>
-
  &gt;&gt; Меньше всех, разумеется, пострадали KDEшные пакеты, и то с редкими &gt;&gt; именами.  :)
+
Тонкость в том, что раньше ещё и так работало (хоть и ругалось):
-
 
+
$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -lfoo1
-
Если бы во всех около-КДЕшных пакетах был нормальный (новый) admin/, давно
+
/usr/bin/ld: warning: libfoo1.so, needed by ./libfoo2.so, not found (try using -rpath or -rpath-link)<br>
-
можно было бы всем им (попробовать) сделать --enable-new-ldflags,
+
А теперь так не работает:
-
добавляющий --as-needed  ;)
+
$ gcc -Wall foo3.c -o foo3 -L. -lfoo2 -lfoo1
-
См. konversation.
+
/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>
-
---- Original Message ----
+
Это 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: Tue, 7 Mar 2006 12:30:53 +0300
+
-
From: Dmitry V. Levin <ldv@altlinux.>
+
-
To: ALT Devel discussion list <devel@lists.altlinux>
+
-
  &gt;&gt;&gt; > Первый ld отличается от второго порядком файлов: &gt;&gt;&gt; > в первом "zv.o -lz", во втором "-lz zv.o". &gt; &gt;&gt; Ага. И такое может сгенерить и automake. И генерит. &gt;&gt;  &gt;&gt; Вход: &gt;&gt; bin_PROGRAMS = mpdscribble &gt;&gt; mpdscribble_SOURCES = mpdscribble.c as.c conn.c escape.c file.c lmc.c \ &gt;&gt;  md5.c misc.c as.h conn.h escape.h file.h lmc.h md5.h misc.h &gt;&gt; AM_CFLAGS="-I./libmpdclient" &gt;&gt; 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>
+
-
&gt; Кстати, а это нововведение в апстриме ? В смысле можно этим агументировать &gt; необходимость пересмотра порядка библиотек при подготовке багрепортов для &gt; апстримов других пакетов ?
+
-
 
+
-
Да, 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 http://sourceware.org/ml/binutils/2006-03/msg00259.html]
+
-
Так что надо будет постепенно всё это зафиксить и за'upstream'ить.
+
=== Ссылки ===
=== Ссылки ===
* [[UpStream/AsNeeded|AsNeeded]]
* [[UpStream/AsNeeded|AsNeeded]]

Версия 20:13, 4 сентября 2008

Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с 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 -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'ить.

Ссылки

 
Личные инструменты