Bug 34935

Summary: gcc не прилинковывает libpthread принудительно при добавлении флага -pthread
Product: Sisyphus Reporter: Aleksei Nikiforov <darktemplaralt>
Component: gcc7Assignee: Nobody's working on this, feel free to take it <nobody>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: aen, aris, lav, rider
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
pthread_test.c
none
gcc_opts.alt.txt
none
gcc_opts.gentoo.txt
none
gcc_opts.fedora.txt
none
gcc_opts.debian.txt
none
ppc64-debian7.log none

Description Aleksei Nikiforov 2018-05-22 11:10:26 MSK
Created attachment 7550 [details]
pthread_test.c

При указании флага -pthread gcc не прилинковывает libpthread к получаемому приложению или библиотеке.

Воспроизведение:
gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread
./pthread_test

Результат: "0"
Ожидаемый результат: "Not zero"
Comment 1 Aleksei Nikiforov 2018-05-22 11:13:52 MSK
Created attachment 7551 [details]
gcc_opts.alt.txt

Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" на Altlinux.
Comment 2 Aleksei Nikiforov 2018-05-22 11:14:57 MSK
Created attachment 7552 [details]
gcc_opts.gentoo.txt

Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" на Gentoo.
Comment 3 Aleksei Nikiforov 2018-05-22 11:15:29 MSK
Created attachment 7553 [details]
gcc_opts.fedora.txt

Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test
-pthread -v" на Fedora.
Comment 4 Aleksei Nikiforov 2018-05-22 11:18:56 MSK
Если сравнить выводы команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" с использованием прикреплённых исходников в качестве файла pthread_test.c, то можно увидеть что на Gentoo и Fedora перед '-lpthread' появляется опция '--no-as-needed', а на Altlinux - нет. Из-за этого на данных дистрибутивах получается ожидаемый результат "Not zero", в то время как на Altlinux - "0".
Comment 5 Dmitry V. Levin 2018-05-23 16:27:01 MSK
А почему, собственно, gcc -Wl,--as-needed -pthread должно принудительно прилинковывать -lpthread вопреки -Wl,--as-needed?

Кстати, на Debian не смотрели?
Comment 6 Anton Farygin 2018-05-23 16:48:06 MSK
На debian не смотрели.
Тесты на gnulib не проходят, а у других проходят.

Что касается --as-needed, то в этом же фишка - заменить его на --no-as-needed в случае флага -pthread
Comment 7 Dmitry V. Levin 2018-05-23 18:31:30 MSK
(In reply to comment #6)
> На debian не смотрели.

Посмотрите :)

> Тесты на gnulib не проходят, а у других проходят.

Если тесты на gnulib не проходят, то это проблема gnulib.
Главная идея gnulib - переносимость.

> Что касается --as-needed, то в этом же фишка - заменить его на --no-as-needed > в случае флага -pthread

Почему?
Основная фишка -pthread в том, чтобы собирать софт, использующий posix threads, не задумываясь, как называется -lpthread и в каком месте её надо указать.
Comment 8 Anton Farygin 2018-05-23 18:42:38 MSK
Это да, но вот с -pthread приаттаченный пример не компилируется
Comment 9 Dmitry V. Levin 2018-05-23 19:04:06 MSK
(In reply to comment #8)
> Это да, но вот с -pthread приаттаченный пример не компилируется

Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK:
он не использует posix threads.
Comment 10 Anton Farygin 2018-05-23 19:07:12 MSK
Created attachment 7558 [details]
gcc_opts.debian.txt

Вариант с Debian
Comment 11 Anton Farygin 2018-05-23 19:10:13 MSK
Дим, проблема ровно в том, что у нас поведение gcc в плане -pthread отличается от окружающего мира.

Да, вылезло это на gnulib, а точнее их тестах. Можно было бы поправить и там, но мне кажется честнее привести себя в одно состояние с остальными, к тому же исправление в общем то понятно.

Более того - у нас даже есть такой пакет как gnulib, в котором это место грязнохакается в процессе сборки ;)
Comment 12 Dmitry V. Levin 2018-05-23 19:18:19 MSK
Created attachment 7559 [details]
ppc64-debian7.log

Вариант с Debian7.
Comment 13 Dmitry V. Levin 2018-05-23 19:18:51 MSK
(In reply to comment #12)
> Created an attachment (id=7559) [details]
> ppc64-debian7.log
> 
> Вариант с Debian7.

Debian с gcc7.
Comment 14 Anton Farygin 2018-05-23 19:36:21 MSK
Да, на Debian с gcc7 такая же история как у нас, но и тесты на пакетах с gnulib они не запускают (пример - hivex).
Comment 15 Aleksei Nikiforov 2018-05-24 10:52:13 MSK
(In reply to comment #8)
> Это да, но вот с -pthread приаттаченный пример не компилируется

Компилируется, но результат не тот: pthread не прилинковывается.

(In reply to comment #9)
> Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK:
> он не использует posix threads.

Да, на основе этих гнулибовских тестов данный пример и сделан. Но тест подразумевает, что при линковке с pthread эти weak symbols возьмутся из pthread. Сейчас же несмотря на явный флаг компилятору -pthread, libpthread не прилинковывается, pthread не доступен несмотря на явное указание сделать иначе.

(In reply to comment #12)
> Created an attachment (id=7559) [details]
> ppc64-debian7.log
> 
> Вариант с Debian7.

Из аттача: --push-state --as-needed -lgcc_s --pop-state
Имхо, самое правильно было бы сделать аналогичное: чтобы '-pthread' разворачивался в '--push-state --no-as-needed -lpthread --pop-state'.

Проверил в Debian 9 (Stretch) с gcc 6.3.0-18+deb9u1, результат "Not zero".
Проверил в Debian sid с gcc 7.3.0-19, результат "0".

Однако, если убрать явное указание '-Wl,--as-needed', то результат на Debian sid становится ожидаемым - "Not zero". На Альте даже с "gcc pthread_test.c -o pthread_test -pthread" всё равно результат "0".
Comment 16 Dmitry V. Levin 2018-05-24 12:57:40 MSK
> (In reply to comment #12)
> > Created an attachment (id=7559) [details] [details]
> > ppc64-debian7.log
> > 
> > Вариант с Debian7.
> 
> Из аттача: --push-state --as-needed -lgcc_s --pop-state

Я думаю, что мы сделаем так же при первом удобном случае.
Comment 17 Repository Robot 2018-05-24 22:45:33 MSK
gcc7-7.3.1-alt4 -> sisyphus:

Thu May 24 2018 Dmitry V. Levin <ldv@altlinux> 7.3.1-alt4
- Updated to redhat/gcc-7-branch r258210.
- Synced with Fedora gcc 7.3.1-5.
- Use --push-state --as-needed and --pop-state instead of --as-needed
  for libgcc (closes: #34935).
- Link libasan, liblsan, libtsan, and libubsan always with --no-as-needed.
- mips64el: set default ABI to N64.
Comment 18 Yuri N. Sedunov 2018-05-25 16:38:04 MSK
Надо б было и binutils обновить, наш ld.gold не знает --push-state, --pop-state.
Comment 19 Dmitry V. Levin 2018-05-25 16:43:44 MSK
(In reply to comment #18)
> Надо б было и binutils обновить, наш ld.gold не знает --push-state, --pop-state.

Безобразие!
Comment 20 Dmitry V. Levin 2018-12-27 01:41:43 MSK
(In reply to comment #9)
> (In reply to comment #8)
> > Это да, но вот с -pthread приаттаченный пример не компилируется
> 
> Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK:
> он не использует posix threads.

JFYI:

Тем временем и gnulib поменялся к лучшему: начиная с коммита v0.1-1978-g426320901, там теперь после -pthread добавляют -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state, если компилятор+линкер это поддерживают.

Это всё хорошо работает до тех пор, пока в дело не вступает libtool, который у нас эту конструкцию переваривает неправильно, цитирую по логу сборки пакета augeas:
86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I../..  -DIN_AUGEAS_GNULIB_TESTS=1 -I. -I. -I../.. -I./../.. -I../../gnulib/lib -I./../../gnulib/lib   -pipe -frecord-gcc-switches -Wall -g -O2 -c -o test-thread_create.o test-thread_create.c
/bin/sh ../../libtool  --tag=CC --preserve-dup-deps  --mode=link x86_64-alt-linux-gcc  -pipe -frecord-gcc-switches -Wall -g -O2   -o test-thread_create test-thread_create.o libtests.a ../../gnulib/lib/libgnu.la libtests.a  -pthread -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state 
libtool: link: x86_64-alt-linux-gcc -pipe -frecord-gcc-switches -Wall -g -O2 -o test-thread_create test-thread_create.o -pthread -Wl,--push-state -Wl,--no-as-needed -Wl,--pop-state  libtests.a ../../gnulib/lib/.libs/libgnu.a -lselinux libtests.a -lpthread -pthread

К счастью, комбинация libtool+gnulib редко встречается, но libtool придётся патчить.
Comment 21 Anton Farygin 2019-01-08 11:40:23 MSK
Когда ожидать исправления libtool ?
Из-за этой проблемы сейчас не пересобирается augeas.