Re: порядок аргументов gcc

2020-09-04 Пенетрантность sergio

On 04/09/2020 14:17, Stanislav Maslovski wrote:

On Fri, Sep 04, 2020 at 01:40:43PM +0300, Anatoly Pugachev wrote:

On Fri, Sep 4, 2020 at 1:12 PM sergio  wrote:

Забавно, но это не у одного меня так:


https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc


И вот тут еще, про --as-needed в секции "Importance of linking order"

https://wiki.gentoo.org/wiki/Project:Quality_Assurance/As-needed



Так, ОК, но я всё равно не понял, почему у Анатолия на той же версии всё 
работает, где этот --as-needed подсовывается?


--
sergio.



Re: порядок аргументов gcc

2020-09-04 Пенетрантность sergio

On 04/09/2020 14:27, Stanislav Maslovski wrote:


Попробуй сделать

gcc --verbose usbtest.c -lusb

и

gcc --verbose -lusb usbtest.c

и сравни вывод.


одинаковый, за исключением названий файлов и порядка -lusb

% diff a b
12c12
<  /usr/lib/gcc/x86_64-linux-gnu/10/cc1 -quiet -v -imultiarch 
x86_64-linux-gnu usbtest.c -quiet -dumpbase usbtest.c -mtune=generic 
-march=x86-64 -auxbase usbtest -version -fasynchronous-unwind-tables -o 
/tmp/cckRKCS2.s

---
>  /usr/lib/gcc/x86_64-linux-gnu/10/cc1 -quiet -v -imultiarch 
x86_64-linux-gnu usbtest.c -quiet -dumpbase usbtest.c -mtune=generic 
-march=x86-64 -auxbase usbtest -version -fasynchronous-unwind-tables -o 
/tmp/ccXYg8d9.s

35c35
<  as -v --64 -o /tmp/ccpmsdG2.o /tmp/cckRKCS2.s
---
>  as -v --64 -o /tmp/cc1hEI67.o /tmp/ccXYg8d9.s
40,41c40,43
<  /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin 
/usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so 
-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper 
-plugin-opt=-fresolution=/tmp/ccgVq9u2.res 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
-plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc 
-plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m 
elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker 
/lib64/ld-linux-x86-64.so.2 -pie 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o 
-L/usr/lib/gcc/x86_64-linux-gnu/10 
-L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu 
-L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib 
-L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu 
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. 
/tmp/ccpmsdG2.o -lusb -lgcc --push-state --as-needed -lgcc_s --pop-state 
-lc -lgcc --push-state --as-needed -lgcc_s --pop-state 
/usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o

< COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
---
>  /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin 
/usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so 
-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper 
-plugin-opt=-fresolution=/tmp/ccblo7B9.res 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
-plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc 
-plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m 
elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker 
/lib64/ld-linux-x86-64.so.2 -pie 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o 
-L/usr/lib/gcc/x86_64-linux-gnu/10 
-L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu 
-L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib 
-L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu 
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. -lusb 
/tmp/cc1hEI67.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc 
-lgcc --push-state --as-needed -lgcc_s --pop-state 
/usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o 
/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o

> /usr/bin/ld: /tmp/cc1hEI67.o: in function `main':
> usbtest.c:(.text+0x5): undefined reference to `usb_init'
> collect2: error: ld returned 1 exit status
zsh: exit 1 diff a b


--
sergio.



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Nefedov . Yury

On Fri, 4 Sep 2020, Stanislav Maslovski wrote:


On Fri, Sep 04, 2020 at 12:36:15PM +0300, sergio wrote:

On 04/09/2020 12:26, Stanislav Maslovski wrote:

gcc --version


gcc (Debian 10.2.0-6) 10.2.0

Это Sid


Попробуй сделать

gcc --verbose usbtest.c -lusb

и

gcc --verbose -lusb usbtest.c

и сравни вывод.

--
Stanislav


 Хорошая идея! :)

 Вывод простой, во всем виновата опция "--as-needed"
 которую теперь при линковке использует по умолчанию gcc.

 gcc-10 -Wl,--no-as-needed -lm math.c

 собирает нормально.

 Опытным путем нашел, что такое поведение начинается с gcc-9.
 gcc-8 работает без --as-needed.

Ю.

Re: порядок аргументов gcc

2020-09-04 Пенетрантность Stanislav Maslovski
On Fri, Sep 04, 2020 at 12:36:15PM +0300, sergio wrote:
> On 04/09/2020 12:26, Stanislav Maslovski wrote:
> > gcc --version
> 
> gcc (Debian 10.2.0-6) 10.2.0
> 
> Это Sid

Попробуй сделать

gcc --verbose usbtest.c -lusb

и

gcc --verbose -lusb usbtest.c

и сравни вывод.

-- 
Stanislav



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Stanislav Maslovski
On Fri, Sep 04, 2020 at 01:40:43PM +0300, Anatoly Pugachev wrote:
> On Fri, Sep 4, 2020 at 1:12 PM sergio  wrote:
> > Забавно, но это не у одного меня так:
> 
> https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc

И вот тут еще, про --as-needed в секции "Importance of linking order"

https://wiki.gentoo.org/wiki/Project:Quality_Assurance/As-needed

-- 
Stanislav



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Anatoly Pugachev
On Fri, Sep 4, 2020 at 1:12 PM sergio  wrote:
>
>
> % gcc -lusb usbtest.c
> /usr/bin/ld: /tmp/cckKmWxL.o: in function `main':
> usbtest.c:(.text+0x5): undefined reference to `usb_init'
> collect2: error: ld returned 1 exit status
> zsh: exit 1 gcc -lusb usbtest.c
> % gcc usbtest.c -lusb
> %
>
> Забавно, но это не у одного меня так:

https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Nefedov . Yury

On Fri, 4 Sep 2020, sergio wrote:



gcc -lusb file.c

раньше работало, а теперь ругается на undefined reference и надо говорить

gcc file.c -lusb


Что произошло и что поменялось?

--
sergio.


  "undefined reference" это ругается компоновщик (linker).
  В принципе, для компоновщика всегда было правило, что
  неопределенные функции ищутся в библиотеках слева направо.
  То есть, если стоит -lu1 -lu2, то неопределенные
  символы в u2 не ищутся в u1.

  В случае с компилируемыми файлами, раньше они всегда переставлялись
  в крайнюю левую позицию до библиотек и поэтому работало.

  > gcc -dumpversion
4.8.5
  > gcc -lm math.c
  OK

  Теперь, видимо, решили унифицировать:
  > gcc -dumpversion
10
  > LANG=C gcc -lm math.c
undefined reference

  Кленг пока еще работает по старому.
  > clang -dumpversion
9.0.1
  > clang -lm math.c
OK

  Вот с какой версии gcc это началось, самому интересно,
  найду, напишу.
Ю.

p.s. "math.c"
#include 
#include 

int main() {
  double x = 3.5;
  printf("  %.1f  %.1f\n",x,-x);
  printf("ceil  %.1f  %.1f\n",ceil(x),ceil(-x));
  printf("floor %.1f  %.1f\n",floor(x),floor(-x));
  printf("round %.1f  %.1f\n",round(x),round(-x));
  printf("trunc %.1f  %.1f\n",trunc(x),trunc(-x));
  printf("nearbyint %.1f  %.1f\n",nearbyint(x),nearbyint(-x));
  return 0;
}

Re: порядок аргументов gcc

2020-09-04 Пенетрантность sergio



% gcc -lusb usbtest.c
/usr/bin/ld: /tmp/cckKmWxL.o: in function `main':
usbtest.c:(.text+0x5): undefined reference to `usb_init'
collect2: error: ld returned 1 exit status
zsh: exit 1 gcc -lusb usbtest.c
% gcc usbtest.c -lusb
%

Забавно, но это не у одного меня так:

https://askubuntu.com/questions/1190940/compiling-a-libusb-0-1-program-fails-with-undefined-reference-errors


--
sergio.



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Anatoly Pugachev
On Fri, Sep 4, 2020 at 12:36 PM sergio  wrote:
>
> On 04/09/2020 12:26, Stanislav Maslovski wrote:
> > gcc --version
>
> gcc (Debian 10.2.0-6) 10.2.0


mator@ttip:~$ gcc -lusb usbtest.c
mator@ttip:~$ gcc usbtest.c -lusb
mator@ttip:~$ ./a.out
mator@ttip:~$ rm ./a.out
mator@ttip:~$ gcc --version
gcc (Debian 10.2.0-6) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



Re: порядок аргументов gcc

2020-09-04 Пенетрантность sergio

On 04/09/2020 12:26, Stanislav Maslovski wrote:

gcc --version


gcc (Debian 10.2.0-6) 10.2.0


Это Sid


--
sergio.



Re: порядок аргументов gcc

2020-09-04 Пенетрантность Stanislav Maslovski
Доброго времени суток,

On Fri, Sep 04, 2020 at 12:01:00PM +0300, sergio wrote:
> gcc -lusb file.c
> раньше работало, а теперь ругается на undefined reference и надо говорить
> gcc file.c -lusb
> Что произошло и что поменялось?

Какая версия gcc?

% gcc --version
gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There
is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

% gcc usbtest.c -lusb
% gcc -lusb usbtest.c
% cat usbtest.c  
#include 

int main()
{
  usb_init();
  return 0;
}

-- 
Stanislav



порядок аргументов gcc

2020-09-04 Пенетрантность sergio



gcc -lusb file.c

раньше работало, а теперь ругается на undefined reference и надо говорить

gcc file.c -lusb


Что произошло и что поменялось?

--
sergio.