Помогите научиться устанавливать программы из исходного кода

Установка, обновление, настройка Linux

Модераторы: Olej, adminn

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение perseus » 08 июн 2017, 14:11

Я думаю, что дело в конфигурировании сборки: GCC поддерживает много языков и много процессорных архитектур, собирать все и по каждому чиху - достаточно бессмысленно
кажется я нашел причину отсутствия компилятора go в инсталлированном вырианте gcc, вот выдержка из руководства по конфигурированию gcc
--enable-languages=lang1,lang2,...
Specify that only a particular subset of compilers and their runtime libraries should be built. For a list of valid values for langN you can issue the following command in the gcc directory of your GCC source tree:
grep language= */config-lang.in
Currently, you can use any of the following: all, ada, c, c++, fortran, go, java, objc, obj-c++. Building the Ada compiler has special requirements, see below. If you do not pass this flag, or specify the option all, then all default languages available in the gcc sub-tree will be configured. Ada, Go and Objective-C++ are not default languages; the rest are.
нужно указывать языки Ada, Go, Objective-C++ явно, по умолчанию они не устанавливаются ;-) а я то установку делал по умолчанию, без указания каких-либо опций, на ошибках учатся :lol:
Попробуем сконфигурировать gcc с опциями --enable-languages=c,c++,go --enable-threads и собрать его заново причём сделаем это с помощью уже инсталлированного утром gcc-4.7.1 :lol:
Последний раз редактировалось perseus 09 июн 2017, 11:07, всего редактировалось 1 раз.

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение perseus » 09 июн 2017, 11:06

Попробуем сконфигурировать gcc с опциями --enable-languages=c,c++,go --enable-threads и собрать его заново причём сделаем это с помощью уже инсталлированного утром gcc-4.7.1
К сожалению результат отрицательный:
../.././libgo/runtime/thread-linux.c:25:25: фатальная ошибка: linux/futex.h: нет такого файла или каталога, компиляция прервана
Судя по всему для языка Go необходим этот заголовочный файл и всё что в нём определено.
А что если я возьму с Fedora25 этот файл futex.h и подсуну его ОС МСВС ?
Попробовал, подсунул и снова попробовал отдельно скомпилировать файл thread-linux.c
gcc -o test thread-linux.c
в результате получаю:
in file included from thread-linux.c
runtime.h:7:20 фатальная ошибка: config.h нет такого файла или каталога компиляция прервана
но уже этого файла "config.h" у меня на Федоре 25 нету, чё делать ? :roll:
но зато такой файл есть уже в самом дереве исходников gcc в папке ../i686-pc-linux-gnu/libgo
ну чтож, попробую снова запустить сборку gcc 8-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 12:16

perseus писал(а):
Попробуем сконфигурировать gcc с опциями --enable-languages=c,c++,go --enable-threads и собрать его заново причём сделаем это с помощью уже инсталлированного утром gcc-4.7.1
К сожалению результат отрицательный:
../.././libgo/runtime/thread-linux.c:25:25: фатальная ошибка: linux/futex.h: нет такого файла или каталога, компиляция прервана
Судя по всему для языка Go необходим этот заголовочный файл и всё что в нём определено.
А что если я возьму с Fedora25 этот файл futex.h и подсуну его ОС МСВС ?
Вообще то, просто "подсунуть" файл *.h вашей проблемы не решает: *.h - это всего лишь заголовочный файл, который описывает прототипы функций, находящихся в библиотеке libc.so - библиотеке системных (и не только) вызовов языка C.
Вам, скорее всего, нужно к собранному компилятору 4.7.1 собрать и библиотеку.
См. (и покажите) что там у вас на сейчас стоит:

Код: Выделить всё

[olej@dell Ukrtelecom]$ ls -l /lib64/libc.*.*
lrwxrwxrwx 1 root root 12 авг 18  2016 /lib64/libc.so.6 -> libc-2.22.so
[olej@dell Ukrtelecom]$ ls -l /lib64/libc-*.*
-rwxr-xr-x 1 root root 2104216 авг 18  2016 /lib64/libc-2.22.so
Про библиотеку, её версии и годы (для относительного соответствия с gcc 4.7.1) см. glibc:
glibc — GNU C Library (GNU библиотека). Glibc является библиотекой Си, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т. д. Библиотека C используется для всех динамически скомпонованых программ. Она написана Free Software Foundation для операционных систем GNU. glibc выпущена под лицензией GNU LGPL.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 12:20

perseus писал(а): Попробовал, подсунул и снова попробовал отдельно скомпилировать файл thread-linux.c
gcc -o test thread-linux.c
в результате получаю:
in file included from thread-linux.c
runtime.h:7:20 фатальная ошибка: config.h нет такого файла или каталога компиляция прервана
но уже этого файла "config.h" у меня на Федоре 25 нету, чё делать ? у кого какие мысли есть ? :roll:
Файл config.h, я думаю (!), у вас не из usr/include, а непосредственно из исходников сборки GCC, можете поискать его там.
Но, предполагаю, что это не решит проблемы: вы "подсунете" ему функцию из futex.h на этапе компиляции, но её не будет при линковке.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 12:28

perseus писал(а): К сожалению результат отрицательный:
../.././libgo/runtime/thread-linux.c:25:25: фатальная ошибка: linux/futex.h: нет такого файла или каталога, компиляция прервана
Судя по всему для языка Go необходим этот заголовочный файл и всё что в нём определено.
Всё может оказаться хуже, чем кажется на 1-й взгляд :-o :

Код: Выделить всё

[olej@dell Ukrtelecom]$ dnf provides '*/futex.h'
Последняя проверка окончания срока действия метаданных: 0:00:30 назад, Fri Jun  9 12:20:23 2017.
kernel-devel-4.7.7-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: @System

kernel-devel-4.8.10-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: @System

kernel-devel-4.8.14-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: @System

kernel-headers-4.8.14-100.fc23.x86_64 : Header files for the Linux kernel for use by glibc
Источник: @System

dietlibc-devel-0.33-8.fc23.i686 : dietlibc development files
Источник: updates

dietlibc-devel-0.33-8.fc23.x86_64 : dietlibc development files
Источник: updates

glibc-arm-linux-gnu-devel-2.24-2.fc23.noarch : Development files for the arm-linux-gnu GNU C Library
Источник: updates

kernel-cross-headers-4.8.13-100.fc23.x86_64 : Header files for the Linux kernel for use by cross-glibc
Источник: updates

kernel-debug-devel-4.8.13-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: updates

kernel-devel-4.8.13-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: updates

kernel-headers-4.8.13-100.fc23.x86_64 : Header files for the Linux kernel for use by glibc
Источник: updates

kernel-cross-headers-4.8.14-100.fc23.x86_64 : Header files for the Linux kernel for use by cross-glibc
Источник: updates-testing

kernel-debug-devel-4.8.14-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: updates-testing

kernel-devel-4.8.14-100.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: updates-testing

kernel-headers-4.8.14-100.fc23.x86_64 : Header files for the Linux kernel for use by glibc
Источник: updates-testing

dietlibc-devel-0.33-5.fc23.i686 : dietlibc development files
Источник: fedora

dietlibc-devel-0.33-5.fc23.x86_64 : dietlibc development files
Источник: fedora

kcbench-data-4.0-0.1-17.fc23.noarch : Kernel sources from 4.0 to be used by kcbench
Источник: fedora

kernel-debug-devel-4.2.3-300.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: fedora

kernel-devel-4.2.3-300.fc23.x86_64 : Development package for building kernel modules to match the kernel
Источник: fedora

kernel-headers-4.2.3-300.fc23.x86_64 : Header files for the Linux kernel for use by glibc
Источник: fedora

uClibc-devel-0.9.33.2-7.fc23.i686 : Header files and libraries for uClibc library
Источник: fedora

uClibc-devel-0.9.33.2-7.fc23.x86_64 : Header files and libraries for uClibc library
Источник: fedora

userspace-rcu-devel-0.8.6-2.fc23.i686 : Development files for userspace-rcu
Источник: fedora

userspace-rcu-devel-0.8.6-2.fc23.x86_64 : Development files for userspace-rcu
Источник: fedora
futex.h - определяет системный вызов ядра Linux:

Код: Выделить всё

$ cat /usr/include/futex.h
...
/*
 * Per-thread list head:
 *
 * NOTE: this structure is part of the syscall ABI, and must only be
 * changed if the change is first communicated with the glibc folks.
 * (When an incompatible change is done, we'll increase the structure
 *  size, which glibc will detect)
 */
...
Фьютекс
Фьютекс (англ. futex, сокращение от англ. fast userspace mutex) — в программировании способ реализации семафоров и мьютексов POSIX в Linux. Впервые введены в ядро Linux с версии 2.5.7 (development); выработана стабильная семантика с 2.5.40; включаются в стабильные версии серии 2.6.x.
futex (2)
Системный вызов sys_futex обеспечивает программный метод для ожидания изменения значения указанного адреса памяти и метод пробуждения всех ожидающих на определенном адресе (хотя адреса для одного и того же участка памяти в разных процессах могут быть не идентичны, ядро распределяет их внутренне так, что один участок памяти, распределенный разными методами, будет соответствовать одинм вызовам sys_futex). Обычно это используется для реализации случаев споров за блокировку разделяемой памяти, как это описано в futex(4).
Вызывающие эту функцию должны твердо придерживаться семантики, описанной в futex(4). Так как эта семантика приводит к созданию непортируемых инструкций ассемблера, то фактически это приведет к тому, что большинство использующих их пользователей станут авторами библиотек, а не создателями программ.
Почитайте эти ссылки - там достаточно много любопытного.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 12:48

Olej писал(а):Почитайте эти ссылки - там достаточно много любопытного.
В Go (новом, после версии 1.5) очень интересный способ организации параллельных ветвей - горутин, это не потоки ядра!
Об этом читайте: Планирование параллельного исполнения в Go.
Судя по всему, футексы именно и используются для диспетчеризации горутин.
Но если в вашей программе не используются горутины, то она никогда и не будет делать такие системные вызовы.
Можете попробовать собрать сильно ограниченную версию gccgo, просто "подсунув" компилятору futex.h - без runtime поддержки со стороны системы (будет просто слетать программа).

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение perseus » 09 июн 2017, 12:49

Компиляцию пока отложил до 13 июня, потому как выходные 3 дня, а процесс этот долгий (более 6 часов)
Вам, скорее всего, нужно к собранному компилятору 4.7.1 собрать и библиотеку.
См. (и покажите) что там у вас на сейчас стоит:
тут стоит libc-2.3.6.so от 14 Авг 2008
Всё может оказаться хуже, чем кажется на 1-й взгляд :-o :
другими словами мы столкнулись с зависимостью от версии ядра ? :roll:
ссылки конечно изучим за выходные, но хотелось бы понять, какими вариантами решения этой проблемы мы располагаем, или решения нет в принципе ? :-?
Судя по всему, футексы именно и используются для диспетчеризации горутин.
Но если в вашей программе не используются горутины, то она никогда и не будет делать такие системные вызовы.
Можете попробовать собрать сильно ограниченную версию gccgo, просто "подсунув" компилятору futex.h - без runtime поддержки со стороны системы (будет просто слетать программа).
то есть попробовать скомпилировать стОит ;-)
а как это собрать ограниченную версию gcc, он ведь автоматически компиляцию сам выполняет ? то есть просто подсунуть и положиться на сам компилятор, я правильно вас понял ?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 13:17

perseus писал(а): тут стоит libc-2.3.6.so от 14 Авг 2008
Точнее (см. glibc):
2.3.6 ноябрь 2005 Debian 4.0 (Etch)
perseus писал(а): то есть попробовать скомпилировать стОит ;-)
а как это собрать ограниченную версию gcc, он ведь автоматически компиляцию сам выполняет ? то есть просто подсунуть и положиться на сам компилятор, я правильно вас понял ?
Да, именно так:
- при самой работе компилятора gccgo футексы вряд ли используются (зачем gcc футексы? ;-) )
- а в самой скомпилированной программе, если не используются горутины, системный вызов futex() (которого нет в вашей системе!) не будет производиться
- но вот если будет futex() (горутина), то программа тут же слетит в кору :cry:
Это нужно проверять.
Но это будет очень ограниченная реализация, не позволяющая использовать в Go одну из лучших его возможностей - горутины.

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение perseus » 09 июн 2017, 18:04

Касательно glibc
Вообще то, просто "подсунуть" файл *.h вашей проблемы не решает: *.h - это всего лишь заголовочный файл, который описывает прототипы функций, находящихся в библиотеке libc.so - библиотеке системных (и не только) вызовов языка C.
Вам, скорее всего, нужно к собранному компилятору 4.7.1 собрать и библиотеку.
А как определить, какую версию glibc имеет смысл собирать для gcc-4.7.1, если Release date GCC 4.7.1 - June 14, 2012?
в системе сейчас установлена libc-2.3.6.so - ноябрь 2005 Debian 4.0 (Etch)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите научиться устанавливать программы из исходного

Непрочитанное сообщение Olej » 09 июн 2017, 23:29

perseus писал(а):Касательно glibc
Вообще то, просто "подсунуть" файл *.h вашей проблемы не решает: *.h - это всего лишь заголовочный файл, который описывает прототипы функций, находящихся в библиотеке libc.so - библиотеке системных (и не только) вызовов языка C.
Вам, скорее всего, нужно к собранному компилятору 4.7.1 собрать и библиотеку.
А как определить, какую версию glibc имеет смысл собирать для gcc-4.7.1, если Release date GCC 4.7.1 - June 14, 2012?
в системе сейчас установлена libc-2.3.6.so - ноябрь 2005 Debian 4.0 (Etch)
Там, по ссылке выше (12:16) относительно glibc, есть табличка (см.):
2.17 декабрь 2012 Поддержка 64-битной архитектуры ARM Ubuntu 13.04, RHEL 7
2.16 июнь 2012 Поддержка x32 ABI, стандарт ISO C11, SystemTap
Или подберите из соображения подходящей вам (близкой) даты.

Ответить

Вернуться в «Администрирование Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя