2021-10-31 23:14:41 +08:00
{{ include('../packages/gcc/README.md') }}
2021-06-26 20:02:42 +08:00
2021-05-12 00:22:43 +08:00
< script >
new Vue({
el: '#main',
data: { package: {} },
mounted: function () {
this.getPackage('gcc');
},
methods: {
getPackage: function(name) {
getPackage(name)
.then(response => this.package = response);
},
}
})
< / script >
## Подготовка
Исправьте пути установки библиотек:
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/prepare') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
## Настройка
2021-10-31 22:52:16 +08:00
???+ note "Обратите внимание"
2021-10-29 23:10:06 +08:00
Н а данном этапе необходимы только компиляторы для C и C++, однако вы можете собрать компиляторы для любых поддерживаемых GCC языков программирования, перечислив их через запятые в опции configure `--enable-languages=c,c++` . GCC поддерживает следующие языки - `c,c++,d,fortran,go,objc,obj-c++` . вы можете собрать все доступные компиляторы, добавив параметр `--enable-languages=c,c++,d,fortran,go,objc,obj-c++` . Если позднее вам потребуется компилятор для какого либо языка из этого списка - пересоберите GCC с е г о поддержкой.
2021-05-12 00:22:43 +08:00
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/configure') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
### Для multilib
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/multi_configure') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
2021-06-10 21:28:16 +08:00
### Значения параметров
2021-05-12 00:22:43 +08:00
2021-07-20 15:37:42 +08:00
`--disable-bootstrap` - предотвращает многократную пересборку GCC
2021-05-12 00:22:43 +08:00
2021-07-20 15:37:42 +08:00
`LD=ld` - сообщает GCC использовать ранее установленную версию компоновщика
2021-05-12 00:22:43 +08:00
## Сборка
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/build') }}
2021-11-01 01:53:57 +08:00
```
2021-06-12 07:23:25 +08:00
2021-05-12 00:22:43 +08:00
## Тестирование
2021-06-26 20:02:42 +08:00
- Увеличьте размер стека по умолчанию
- Произведите тестирование от непривилегированного пользователя во избежание непредвиденных ситуаций с системой.
2021-06-12 07:23:25 +08:00
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/test') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
2021-10-31 22:52:16 +08:00
???+ note "Обратите внимание"
2021-10-31 06:07:18 +08:00
Тестирование этого пакета занимает достаточно много времени.
2021-06-12 17:36:17 +08:00
2021-05-12 00:22:43 +08:00
Для просмотра итогов теста выполните:
```bash
../contrib/test_summary
```
2021-10-31 22:52:16 +08:00
???+ warning "Предупреждение"
2021-10-31 06:07:18 +08:00
Известно, что 6 тестов, связанных с `get_time` , дают сбои. По видимому, это связано с локалью `en_HK` . Кроме того, тест `COSTEXPR-52830` не удается.
2021-06-12 07:23:25 +08:00
2021-05-12 00:22:43 +08:00
## Установка
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/install') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
2021-06-10 21:28:16 +08:00
- Удалите ненужную директорию,
2021-06-27 05:33:10 +08:00
- Убедитесь, что владелец установленных заголовков корректный,
2021-06-10 21:28:16 +08:00
- По историческим причинам некоторые программы могут пытаться найти `cpp` в директории `/lib` . Создайте ссылку,
- Для поддержки LTO требуется следующая символическая ссылка,
- Переместите файлы в правильное место:
2021-05-12 00:22:43 +08:00
2021-11-01 01:53:57 +08:00
```bash
2021-10-31 21:48:07 +08:00
{{ include('../packages/gcc/postinstall') }}
2021-11-01 01:53:57 +08:00
```
2021-05-12 00:22:43 +08:00
2021-07-21 03:28:56 +08:00
## При использовании раздельных каталогов:
- Замените `ln -svr /usr/bin/cpp /usr/lib` из предыдущей команды на корректную для раздельной структуры.
2021-06-30 19:40:20 +08:00
## Проверка работоспособности
2021-10-31 22:52:16 +08:00
???+ danger "Важно"
2021-10-29 23:10:06 +08:00
Сейчас необходимо проверить работу `gcc` . Если всё нормально, то продолжайте сборку.
2021-06-30 19:40:20 +08:00
Выполните набор команд:
2021-05-12 00:22:43 +08:00
```bash
echo 'int main(){}' > dummy.c
2021-06-30 19:40:20 +08:00
cc dummy.c -v -Wl,--verbose & > dummy.log
readelf -l a.out | grep ': /lib'
```
Ошибок быть не должно, а результат команды (учитывая различия в имени динамического компоновщика, зависящие от платформы) будет следующий:
```
Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
2021-05-12 00:22:43 +08:00
```
2021-06-30 19:40:20 +08:00
Проверим что задействованы правильные стартовые файлы. Выполните команду:
2021-05-12 00:22:43 +08:00
```bash
2021-06-30 19:40:20 +08:00
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
```
Результат выполнения:
```
2021-08-05 01:31:01 +08:00
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crtn.o succeeded
2021-06-30 19:40:20 +08:00
```
В зависимости от архитектуры, приведенное выше может немного отличаться. Разница будет в названии каталога после `/usr/lib/gcc` . Здесь важно обратить внимание на то, что `gcc` обнаружил все три файла `crt * .o` в каталоге `/usr/lib` .
Проверим то, что компилятор выполняет поиск корректных заголовочных файлов:
```bash
grep -B4 '^ /usr/include' dummy.log
```
Результат выполнения:
```
#include <...> search starts here:
2021-08-05 01:31:01 +08:00
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include
2021-06-30 19:40:20 +08:00
/usr/local/include
2021-08-05 01:31:01 +08:00
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed
2021-06-30 19:40:20 +08:00
```
Проверим, что компоновщик использует корректные пути поиска:
```bash
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
```
Результат выполнения:
```
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
```
Проверим, что используется корректная стандартная библиотека
```bash
grep "/lib.*/libc.so.6 " dummy.log
2021-05-12 00:22:43 +08:00
```
2021-06-30 19:40:20 +08:00
Результат выполнения:
```
attempt to open /usr/lib/libc.so.6 succeeded
```
Проверим, что используется корректный динамический компоновщик:
```bash
2021-07-06 18:02:59 +08:00
grep "found ld-linux*" dummy.log
2021-06-30 19:40:20 +08:00
```
Результат выполнения должен быть (учитывая различия в имени динамического компоновщика, зависящие от платформы):
```
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2
```
2021-10-31 22:52:16 +08:00
???+ warning "Предупреждение"
2021-10-29 23:10:06 +08:00
Если вывод не соответствует вышеуказанному, или вообще не получен, значит, что-то не так. Изучите и повторите шаги, чтобы выяснить, в чем проблема. Перед продолжением процесса необходимо решить любые проблемы.
2021-06-30 19:40:20 +08:00
2021-05-12 00:22:43 +08:00
Удалите тестовые файлы:
```bash
2021-06-30 19:40:20 +08:00
rm -v dummy.c a.out dummy.log
2021-05-12 00:22:43 +08:00
```
## Установленные файлы
2021-06-26 20:02:42 +08:00
Программы: c++ (ссылка на g++), cc (ссылка на gcc), cpp, g++, gcc, gcc-ar, gcc-nm, gcc-ranlib, gcov, gcov-dump и gcov-tool
2021-05-12 00:22:43 +08:00
2021-06-26 20:02:42 +08:00
Библиотеки: libasan.{a,so}, libatomic.{a,so}, libcc1.so, libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so}, libitm.{a,so}, liblsan.{a,so}, liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.{a,so}, libstdc++fs.a, libsupc++.a, libtsan.{a,so} и libubsan.{a,so}
2021-05-12 00:22:43 +08:00
2021-08-05 01:31:01 +08:00
Директории: /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc и /usr/share/gcc-11.2.0