gold
Материал из Xgu.ru
gold — новый линковщик (пришедший на смену существующему GNU ld), разработанный Яном Тэйлором (Ian Taylor). Интегрирован в binutils начиная с 2.18 (но по умолчанию не используется). Призван ускорить сборку программ (особенно C++); скорость линковки повышается иногда значительно, вплоть до пятикратной.
Содержание |
[править] Зачем?
Ian Taylor, создатель gold:
« ELF conceptually requires three passes over the object files, a.out and COFF require two. A version of the third pass was hacked into the GNU linker by using a backpatch system on the symbol table, in which the GNU linker makes some decisions when it first reads the object file, and then undoes those decisions when appropriate after seeing all the objects. The backpatching causes the GNU linker to traverse the symbol table multiple times; this is very expensive in a large link. Reducing the number of symbol table traversals is probably the most significant change. »
[править] Как включить?
При сборке binutils добавить опцию --enable-gold.
[править] Как проверить gold ли?
ld --version
должна говорить GNU gold
[править] Какие проблемы с ним?
Проблем всё меньше и меньше, но они ещё остались.
-
Нельзя собрать ядро Linux(уже можно) - Нельзя собрать GLIBC
- gold не резолвит символы используя косвенные зависимости (это не совсем проблема, а запланированное поведение, но нужно иметь это в виду)
- сам gold написан на C++, это значит, что его можно собрать, только если в системе уже есть компилятор c++ (одного компилятора Си не хватит)
[править] Как переключаться с одного линковщика на другой?
Пока что gold обычный ld не заменит (и не факт, что заменит в будущем), поэтому хорошо иметь возможность выбора между ними (например, для того чтобы использовать gold при разработке и обычный ld для релизов).
Хуже всего, что у gcc нет опций командной строки, с помощью которых можно было бы явно указать, какой линковщик мы используем. Есть несколько вариантов решения:
- отключить линковку в gcc и потом линковать самому вручную
- использовать опцию -B gcc, которая говорит, в каком каталоге нужно сначала попробовать найти линковщик и положить gold в отдельный каталог. Например, так (предполагается, что gold лежит в ~/binutils/bin):
$ g++ -B ~/binutils/bin hello.o -o hello
- задавать через spec-файл gcc, какой линковщик мы хотим использовать
- создать враппер, который будет вызывать ld.gold или ld.old в зависимости от переменных окружения (это немного странный способ, учитывая, что мы хотим добиться от gold ускорения сборки)
[править] Дополнительная информация
- A New ELF Linker (англ.)
- Striking gold in binutils (англ.) --- анонс и обсуждение gold на lwn.net
Йан Тейлор (Ian Lance Taylor) рассказывает о своём детище gold и вообще о программах для связывания (linkers) в двадцати постах:
- Linkers, part1 (англ.)
- Linkers, part2 (англ.) Basic Linker Data Types, Basic Linker Operation
- Linkers, part3 (англ.) Address Spaces, Object File Formats
- Linkers, part4 (англ.) Shared Libraries
- Linkers, part5 (англ.)
- Linkers, part6 (англ.)
- Linkers, part7 (англ.)
- Linkers, part8 (англ.)
- Linkers, part9 (англ.)
- Linkers, part10 (англ.)
- Linkers, part11 (англ.)
- Linkers, part12 (англ.)
- Linkers, part13 (англ.)
- Linkers, part14 (англ.)
- Linkers, part15 (англ.)
- Linkers, part16 (англ.)
- Linkers, part17 (англ.)
- Linkers, part18 (англ.)
- Linkers, part19 (англ.)
- Linkers, part20 (англ.)
Ещё:
- Linkers and Loaders (англ.), John Levine
- Beginner's Guide to Linkers (англ.)