Страница 5 из 6
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 08 июн 2017, 14:11
perseus
Я думаю, что дело в конфигурировании сборки: 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++ явно, по умолчанию они не устанавливаются
а я то установку делал по умолчанию, без указания каких-либо опций, на ошибках учатся
Попробуем сконфигурировать gcc с опциями --enable-languages=c,c++,go --enable-threads и собрать его заново причём сделаем это с помощью уже инсталлированного утром gcc-4.7.1
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 11:06
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 и подсуну его ОС МСВС ?
Попробовал, подсунул и снова попробовал отдельно скомпилировать файл 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 нету, чё делать ?
но зато такой файл есть уже в самом дереве исходников gcc в папке ../i686-pc-linux-gnu/libgo
ну чтож, попробую снова запустить сборку gcc
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 12:16
Olej
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.
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 12:20
Olej
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 нету, чё делать ? у кого какие мысли есть ?
Файл config.h, я думаю (!), у вас не из usr/include, а непосредственно из исходников сборки GCC, можете поискать его там.
Но, предполагаю, что это не решит проблемы: вы "подсунете" ему функцию из futex.h на этапе компиляции, но её не будет при линковке.
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 12:28
Olej
perseus писал(а):
К сожалению результат отрицательный:
../.././libgo/runtime/thread-linux.c:25:25: фатальная ошибка: linux/futex.h: нет такого файла или каталога, компиляция прервана
Судя по всему для языка Go необходим этот заголовочный файл и всё что в нём определено.
Всё может оказаться хуже, чем кажется на 1-й взгляд
:
Код: Выделить всё
[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). Так как эта семантика приводит к созданию непортируемых инструкций ассемблера, то фактически это приведет к тому, что большинство использующих их пользователей станут авторами библиотек, а не создателями программ.
Почитайте эти ссылки - там достаточно много любопытного.
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 12:48
Olej
Olej писал(а):Почитайте эти ссылки - там достаточно много любопытного.
В Go (новом, после версии 1.5) очень интересный способ организации параллельных ветвей - горутин, это
не потоки ядра!
Об этом читайте:
Планирование параллельного исполнения в Go.
Судя по всему,
футексы именно и используются для диспетчеризации горутин.
Но если
в вашей программе не используются горутины, то она никогда и не будет делать такие системные вызовы.
Можете попробовать собрать
сильно ограниченную версию gccgo, просто "подсунув" компилятору futex.h - без runtime поддержки со стороны системы (будет просто слетать программа).
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 12:49
perseus
Компиляцию пока отложил до 13 июня, потому как выходные 3 дня, а процесс этот долгий (более 6 часов)
Вам, скорее всего, нужно к собранному компилятору 4.7.1 собрать и библиотеку.
См. (и покажите) что там у вас на сейчас стоит:
тут стоит libc-2.3.6.so от 14 Авг 2008
Всё может оказаться хуже, чем кажется на 1-й взгляд
:
другими словами мы столкнулись с зависимостью от версии ядра ?
ссылки конечно изучим за выходные, но хотелось бы понять, какими вариантами решения этой проблемы мы располагаем, или решения нет в принципе ?
Судя по всему, футексы именно и используются для диспетчеризации горутин.
Но если в вашей программе не используются горутины, то она никогда и не будет делать такие системные вызовы.
Можете попробовать собрать сильно ограниченную версию gccgo, просто "подсунув" компилятору futex.h - без runtime поддержки со стороны системы (будет просто слетать программа).
то есть попробовать скомпилировать стОит
а как это собрать ограниченную версию gcc, он ведь автоматически компиляцию сам выполняет ? то есть просто подсунуть и положиться на сам компилятор, я правильно вас понял ?
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 13:17
Olej
perseus писал(а):
тут стоит libc-2.3.6.so от 14 Авг 2008
Точнее (см.
glibc):
2.3.6 ноябрь 2005 Debian 4.0 (Etch)
perseus писал(а):
то есть попробовать скомпилировать стОит
а как это собрать ограниченную версию gcc, он ведь автоматически компиляцию сам выполняет ? то есть просто подсунуть и положиться на сам компилятор, я правильно вас понял ?
Да, именно так:
- при самой работе
компилятора gccgo футексы вряд ли используются (зачем gcc футексы?
)
- а в самой
скомпилированной программе, если не используются горутины, системный вызов futex() (которого нет в вашей системе!) не будет производиться
- но вот если будет futex() (горутина), то программа тут же слетит в кору
Это нужно
проверять.
Но это будет очень ограниченная реализация, не позволяющая использовать в Go одну из лучших его возможностей - горутины.
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 18:04
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)
Re: Помогите научиться устанавливать программы из исходного
Добавлено: 09 июн 2017, 23:29
Olej
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
Или подберите из соображения подходящей вам (близкой) даты.