К основному содержанию
скилл CX Codex

linkers-lto — скилл для Claude Code: линковка и LTO

Скилл для настройки линкеров GNU ld, gold и lld, разбора ошибок порядка библиотек и включения LTO в реальных проектах.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill linkers-lto -a claude-code
Открыть на GitHub

Что делает linkers-lto

Скилл ведёт агента по девяти шагам: выбор линкера, ключевые флаги, порядок библиотек, LTO для GCC и Clang, удаление мёртвого кода, видимость символов, разбор типовых ошибок линковки и генерация map-файла. Внутри есть таблица выбора между GNU ld, gold и lld с командами вида -fuse-ld=lld, а также справочник по флагам в references/flags.md.

Отдельный блок про порядок библиотек. GNU ld обрабатывает архивы слева направо, поэтому библиотека должна идти после объектов, которые её требуют. Для циклических зависимостей между архивами скилл предлагает обернуть их в -Wl,--start-group и -Wl,--end-group.

Для LTO важно, что при линковке флаг -flto нужно передать повторно, а архивы собирать через gcc-ar и gcc-ranlib, а не обычным ar. Если собрать статическую библиотеку обычным ar, линковка с LTO сломается. ThinLTO в Clang кэширует результаты, каталог кэша задаётся через -Wl,--thinlto-cache-dir=/tmp/thinlto-cache.

Скилл активируется на запросы про -flto, thin LTO, LTCG, --gc-sections, ошибки порядка линковки, слабые символы и линкер-скрипты.

Какие задачи решает

  • выбрать линкер между ld, gold и lld под конкретную сборку
  • починить undefined reference из-за неверного порядка библиотек
  • включить LTO в проекте на GCC или Clang без поломки архивов
  • сократить размер бинарника через --gc-sections
  • разобраться с дублирующимися и слабыми символами

Примеры запросов агенту

  • Собираю проект с GCC, хочу перейти на lld — какие флаги добавить?
  • Получаю undefined reference to 'foo' при линковке, помоги разобраться с порядком библиотек
  • Включи ThinLTO для сборки на Clang и объясни, что нужно поменять в архивах

Как установить linkers-lto

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill linkers-lto -a claude-code

2Вручную: положить файлы

~/.claude/skills/linkers-lto/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/linkers-lto/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора62

linux-kernel-modules Ведёт агента по написанию и отладке загружаемых модулей ядра Linux: Kbuild, параметры модуля, /proc, sysfs, символьные устройства, KGDB и ftrace. CX Codex +1 639установок memory-model Скилл для работы с моделью памяти C++ и Rust: подсказывает, какой memory order выбрать, и разбирает гонки данных в атомиках. CX Codex +1 634установок heaptrack Ведёт агента по heaptrack: запись трасс аллокаций, разбор через heaptrack_print, поиск утечек и сравнение запусков. CX Codex +1 623установок msvc-cl Подсказывает агенту, как компилировать C и C++ через MSVC cl.exe и clang-cl: флаги, рантайм, PDB, ошибки линковки. CX Codex +1 617установок binutils Скилл для работы с бинарниками: статические библиотеки, strip, objcopy, addr2line, strings и c++filt. Пригодится, когда агент должен сам разобраться с постобработкой ELF. CX Codex +1 608установок dynamic-linking Скилл для работы с динамической линковкой в Linux: разбирает ошибки загрузки .so, настройку RPATH и RUNPATH, версионирование soname. CX Codex +1 600установок rust-profiling Скилл для анализа производительности Rust: флеймграфы, размер бинарника, раздувание мономорфизации и микробенчмарки Criterion. CX Codex +1 586установок interpreters Подсказывает агенту, как устроить диспетчеризацию байткода, стековую или регистровую ВМ и простой JIT через mmap. CX Codex +1 564установок

Похожие

atheris trailofbits Настраивает coverage-guided фаззинг Python-кода и C-расширений через Atheris. Нужен для поиска сбоев и повреждений памяти. CX Codex +1 5 200установок bazel-build-optimization Seth Hobson Скилл помогает настраивать Bazel для монорепозиториев, удалённого выполнения и кэширования. Подойдёт для разбора проблем сборки и ускорения пайплайна. CX Codex 10 300установок including-generated-files dotnet Помогает подключить файлы, созданные во время сборки, к компиляции или выходным данным MSBuild. Нужен, когда созданный файл не подхватывается автоматически. CX Codex +1 3 400установок extension-points dotnet Скилл разбирает, откуда MSBuild берёт хуки и импорты: CustomBefore/CustomAfter, wildcard-каталоги, авто-импорты NuGet. Пригодится, когда ассеты пропали или подменились. CX Codex +1 3 000установок nx Mindrally Скилл задаёт агенту правила работы с Nx: структура apps и libs, теги, границы модулей, генераторы и кэш. Пригодится, если проект уже собран на Nx. CX Codex +1 682установок turborepo Mindrally Скилл задаёт агенту правила работы с Turborepo: структура воркспейсов, turbo.json, кэш и фильтры задач. Пригодится, когда монорепо уже есть и его надо привести в порядок. CX Codex +1 658установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о linkers-lto

Как установить linkers-lto в Claude?

Выполните npx skills add mohitmishra786/low-level-dev-skills --skill linkers-lto -a claude-code. Скилл появится в ~/.claude/skills/linkers-lto/SKILL.md.

Что делает linkers-lto?

Проводит агента по выбору линкера, флагам, порядку библиотек, настройке LTO и разбору ошибок линковки. Отдельно разбирает удаление мёртвого кода и видимость символов.

С какими линкерами работает скилл?

С GNU ld, gold и lld. Для LTO в Clang нужен lld, для GCC-архивов — gcc-ar и gcc-ranlib вместо обычного ar.

Исходный текст

SKILL.md · MIT
---
name: linkers-lto
description: Linker and Link-Time Optimisation (LTO) skill. Use when configuring GNU ld, gold, or lld linker flags, diagnosing link-order issues or undefined symbols at link time, enabling LTO safely in real projects, or understanding inter-module optimisation trade-offs. Activates on queries about linker flags, -flto, thin LTO, LTCG, --gc-sections, link order errors, weak symbols, or linker scripts.
---

# Linkers and LTO

## Purpose

Guide agents through linker selection, common linker flags, link-order issues, LTO setup, and symbol-visibility management.

## Triggers

- "I'm getting `undefined reference` at link time"
- "How do I enable LTO for a real project?"
- "Which linker should I use: ld, gold, or lld?"
- "How do I reduce binary size with `--gc-sections`?"
- "How do I write or understand a linker script?"
- "I have duplicate symbol or weak symbol issues"

## Workflow

### 1. Linker selection

| Linker | Invocation | Strengths |
|--------|-----------|-----------|
| GNU ld (BFD) | default on Linux | Universal, stable |
| gold | `-fuse-ld=gold` | Faster than ld for C++; supports LTO plugins |
| lld (LLVM) | `-fuse-ld=lld` | Fastest, parallel, required for Clang LTO |

```bash
# Use lld with GCC or Clang
gcc -fuse-ld=lld -o prog ...
clang -fuse-ld=lld -o prog ...

# Check which linker is used
gcc -v -o prog main.c 2>&1 | grep 'Invoking'
```

### 2. Essential linker flags

```bash
# Pass linker flags via compiler driver:
# -Wl,flag1,flag2   (comma-separated, no spaces)
# -Wl,flag1 -Wl,flag2  (separate -Wl options)

gcc main.c -o prog \
  -Wl,-rpath,/opt/mylibs/lib \     # runtime library search path
  -Wl,--as-needed \                 # only link libraries that are actually used
  -Wl,--gc-sections \               # remove unused sections (requires -ffunction-sections -fdata-sections)
  -Wl,-z,relro \                    # mark relocations read-only after startup
  -Wl,-z,now \                      # resolve all symbols at startup (full RELRO)
  -L/opt/mylibs/lib -lfoo
```

### 3. Link order matters (GNU ld)

GNU ld processes archives left-to-right. A library must come after the objects that need it.

```bash
# Wrong: libfoo provides symbols needed by main.o
gcc main.o -lfoo libdep.a -o prog   # can fail if libdep.a needs libfoo

# Correct: dependencies after dependents
gcc main.o -lfoo -ldep -o prog

# If there are circular deps between archives:
gcc main.o -Wl,--start-group -lfoo -lbar -Wl,--end-group -o prog
# --start-group/--end-group: repeat search until no new symbols resolved
```

### 4. LTO with GCC

```bash
# Compile
gcc -O2 -flto -ffunction-sections -fdata-sections -c foo.c -o foo.o
gcc -O2 -flto -ffunction-sections -fdata-sections -c bar.c -o bar.o

# Link (must pass -flto again)
gcc -O2 -flto -Wl,--gc-sections foo.o bar.o -o prog

# Archives: must use gcc-ar / gcc-ranlib, not plain ar
gcc-ar rcs libfoo.a foo.o
gcc-ranlib libfoo.a
```

Parallel LTO:

```bash
gcc -O2 -flto=auto foo.o bar.o -o prog   # uses jobserver
gcc -O2 -flto=4   foo.o bar.o -o prog    # 4 parallel jobs
```

### 5. LTO with Clang / lld

```bash
# Full LTO
clang -O2 -flto -fuse-ld=lld foo.c bar.c -o prog

# ThinLTO (faster, nearly same quality)
clang -O2 -flto=thin -fuse-ld=lld foo.c bar.c -o prog

# LTO with cmake: set globally
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)   # enables -flto
```

ThinLTO caches work: subsequent builds that reuse unchanged modules are faster.
Cache location: specify with `-Wl,--thinlto-cache-dir=/tmp/thinlto-cache`.

### 6. Dead-code stripping

```bash
# Compile with per-function/per-data sections
gcc -O2 -ffunction-sections -fdata-sections -c foo.c -o foo.o

# Link with garbage collection
gcc -Wl,--gc-sections foo.o -o prog

# Verify what was removed
gcc -Wl,--gc-sections -Wl,--print-gc-sections foo.o -o prog 2>&1 | head -20
```

On macOS, the linker strips dead code by default (`-dead_strip`).

### 7. Symbol visibility

Controlling visibility reduces DSO size and enables better LTO:

```bash
# Hide all symbols by default, export explicitly
gcc -fvisibility=hidden -O2 -shared -fPIC foo.c -o libfoo.so

# In source, mark exports:
__attribute__((visibility("default"))) int my_public_function(void);
```

Or use a version script:

```text
# foo.ver
{
  global: my_public_function; my_other_public;
  local: *;
};
```

```bash
gcc -Wl,--version-script=foo.ver -shared -fPIC -o libfoo.so foo.o
```

### 8. Common linker errors

| Error | Cause | Fix |
|-------|-------|-----|
| `undefined reference to 'foo'` | Missing library or wrong order | Add `-lfoo`; move after the object that needs it |
| `multiple definition of 'foo'` | Symbol defined in two TUs | Remove duplicate; use `static` or `extern` |
| `cannot find -lfoo` | Library not in search path | Add `-L/path/to/lib`; install dev package |
| `relocation truncated` | Address overflow in relocation | Use `-mcmodel=large`; restructure image |
| `version 'GLIBC_2.33' not found` | Binary needs newer glibc | Link statically or rebuild on older host |
| `circular reference` | Archives mutually depend | Use `--start-group`/`--end-group` |

### 9. Linker map file

```bash
# Generate a map file (shows symbol → section → file)
gcc -Wl,-Map=prog.map -o prog foo.o bar.o
less prog.map
```

Useful for debugging binary size and symbol placement.

For a comprehensive linker and LTO flags reference, see [references/flags.md](references/flags.md).

## Related skills

- Use `skills/binaries/elf-inspection` for examining the resulting binary
- Use `skills/compilers/gcc` or `skills/compilers/clang` for compile-phase LTO flags
- Use `skills/binaries/binutils` for `ar`, `strip`, `objcopy`

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой