LINUX.ORG.RU

потому что иногда бывают здоровенные проекты, в которых сначала генерируется много объектых файлов (с помощью того же gcc), и при этом всю эту компиляцию можно распараллелить, а потом с помощью ld уже собрать все эти объектники

reprimand ★★★★★
()

Одна из причин: список параметров вызова ld может оказаться проще чем вызов gcc для той же задачи.

Elyas ★★★★★
()

Зачем запускать gcc с объектными файлами, если «можно просто запускать со всеми» исходными файлами?
По теме: чтобы gcc не напихал лишней отсебятины.

anonymous
()

На самом деле вопрос стоит наоборот: зачем запускать gcc если есть ld? Ответ довольно неожиданный: если часть обьектников была скомпилена из плюсового кода то гцц расставит вызовы конструкторов и деструкторов в правильные места (статических ???) ну и сгенерит ещё какой-то инициализирующий код для тех же плюсовых обьектников. Подробности читаем в документации на gcc.

Вобщем это одна из главных причин по которой я ненавижу C++.

cvv ★★★★★
()
Ответ на: комментарий от cvv

ну и сгенерит ещё какой-то инициализирующий код для тех же плюсовых обьектников.

Во время сборки? Нет такого. Скрипт линкера по умолчанию содержит размещение секций инициализации/деинициализации (ld -verbose).

я ненавижу C++.

А, понятно…

xaizek ★★★★★
()

ld – отдельная программа. Вот её и можно запускать как и другие программы.

xaizek ★★★★★
()

а разве gcc не запускает ld для линковки

Harald ★★★★★
()
Ответ на: комментарий от reprimand

а потом с помощью ld уже собрать все эти объектники

Ровно также как и с помощью gcc.

slovazap ★★★★★
()

Не вижу никакого смысла. Может быть какие-то хитрые ключи для ld, типа кастомных растроек секций, linker scripts, это всё, но это всё можно и из gcc передать через -Wl. А так gcc вызывать всегда предпочтительно, ибо он делает больше чем ld и делает это правильно.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

например, можно скомпилировать не линкуя (не раставляя конкретные адреса), потом уже все объектные файлы (в том числе и ранее скомпилированные сторонние библиотеки), можно слинковать в единый бинарник.

abondarev ★★★
()

Зачем нужен явный вызов ld?

А его давно уже явно и не вызывают. Все популярные системы сборки, которые генерируют Makefile’ы вызывают gcc -Wl,-ldd-param (или g++) в случае с C++.

EXL ★★★★★
()

Ты бы поделился секретом, где ты увидел что это нужно.

anonymous
()

gnu ld это часть binutils, а gcc это часть gcc. Можно уметь юзать одно без другого.

Реальный юзкейс тебе в самом первом посте кинули. Ещё можно генерить объектные файлы не в gcc вообще и проходиться линковщиком - тут много «но» и «если», но это реально.

Bfgeshka ★★★★★
()
Ответ на: комментарий от cvv

Я отвечаю на утверждение, что gcc выполняет обработку конструкторов/деструкторов во время сборки, а не просто дёргает ld с флагами. Оно же было в исходном комментарии или мне показалось?

xaizek ★★★★★
()

Можно со своим линкер скриптом, например - весьма распространено а baremetal

anonymous
()
Ответ на: комментарий от slovazap

Он делает ровно то что задано в specs - иногда дефолт не всегда подходит

anonymous
()
Ответ на: комментарий от cvv

А что ещё он предположительно делает и где это искать в документации (примерно)? Просто я имел дело с компиляторами и тулчейнами, но не понимаю, что gcc как компилятор может ещё делать во время сборки.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

А что ещё он предположительно делает

Я уже весьма смутно помню, так как я посчитал глупостью ходить по этим граблям. Возмодно еще что-то делает с исключениями.

где это искать в документации (примерно)?

Эти грабли здесь на ЛОРе не раз обсуждались. И на StackOwerflow тоже многократно. Скорее всего вот здесь: https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/

но не понимаю, что gcc как компилятор может ещё делать во время сборки.

Тут проблема в том что С++ настолько переусложнен что по-другому определенный функционал не реализуешь.

cvv ★★★★★
()
Ответ на: комментарий от reprimand

reprimand ★★★★★ (20.03.2019 14:12:39)

потому что иногда бывают здоровенные проекты, в которых сначала генерируется много объектых файлов (с помощью того же gcc), и при этом всю эту компиляцию можно распараллелить, а потом с помощью ld уже собрать все эти объектники

Я повторюсь:

Northsoft ★★ 20.03.2019 14:07:25

Поделитесь секретом, зачем это нужно? Когда как можно просто запускать gcc со всеми объектными файлами.

Northsoft ★★
() автор топика
Ответ на: комментарий от Northsoft

Я повторюсь:

Тебе вроде как написали уже.

Когда компилятор, внезапно, не GCC.

EXL ★★★★★
()
Ответ на: комментарий от Northsoft

Я повторюсь

если ты хочешь запускать gcc со всеми объектыми файлами, и, таким образом, использовать gcc вместо ld, то да, ДЛЯ ТЕБЯ (не имеющего дела с большими проектами) ld не нужен

reprimand ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.