URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 126170
[ Назад ]

Исходное сообщение
"Первый стабильный релиз компоновщика Mold, развиваемого разработчиком LLVM lld"

Отправлено opennews , 16-Дек-21 11:14 
Rui Ueyama, автор компоновщика LLVM lld и компилятора chibicc, представил первый стабильный релиз нового высокопроизводительного компоновщика Mold, заметно опережающего по скорости  связывания объектных файлов компоновщики GNU gold и LLVM lld. Проект признан готовым для рабочих внедрений и может применяться в качестве более быстрой прозрачной замены GNU linker на Linux-системах. Из планов на следующий значительный выпуск отмечается доведение до готовности поддержки платформы macOS, после чего начнётся работа по адаптации Mold для Windows...

Подробнее: https://www.opennet.dev/opennews/art.shtml?num=56358


Содержание

Сообщения в этом обсуждении
"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:14 
> Mold написан на языке С++ (C++20)

печально


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Корец , 16-Дек-21 11:17 
>при сборке Chrome 96 (размером кода 1.89 ГБ) на компоновку исполняемых файлов c debuginfo на 8-ядерном компьютере при использовании GNU gold тратится 53 секунды, LLVM lld - 11.7 секунд, а Mold всего 2.2 секунды (в 26 раз быстрее GNU gold).

Вовсе не печально.
А у тебя есть альтернативы, которые работают быстрее сабжа и написанные на "правильном" ЯП?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:48 
c++20 это в твоем понимании правильный яп ?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено AnalMal , 16-Дек-21 13:02 
Да, правильный. Но никто не запрещает писать тебе писать на С++98

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 14:33 
> Но никто не запрещает писать тебе писать на С++98

ты утверждаешь что это write-only язык ?
прочитай что написано в новости - проект на c++20


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:27 
>печально

Да, жаль, что не на Си.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 13:08 
да, код на Си намного читабельнее кода на современном C++

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 20:49 
Увы, но, современный код на си, даже при том, что читабельный сам по себе, заставляет городить невообразимые тонны нечитаемого бойлерплейта, который ещё и еггог проне. У меня не получается сделать корректно и не превратить либо в лапшу либо в 1000 этажные инлайны с препроцессором. Для высокоуровневых задач плючи всё же намного лучше, кроме того есть уже нормальные стандартные реализации для многих вещей и их обычно достаточно. Особенно современные. Когда хватает самой примитивной работы с байтами, тут да, си вне конкуренции (и то придётся обмазаться расширениями). Интероп опять же намного более годный на мой взгляд тоже в си.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 08:56 
Если у тебя "1000 этажные инлайны с препроцессором", то в этом виноват только ты сам. Не умеешь организовывать код. GTK писан на чистом Си, а сам код чётко структурирован как ООП.

Не умеешь писать в процедурном стеле не лезь.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено мое правило , 18-Дек-21 00:19 
Только чет он так круто организованный, что гномьи авторы придумали vala, только что бы не писать на всратом с.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 03:06 
Замечательно, что не на С, а на С++20. И разработка быстрее, и код читабельнее, и производительность на высоте. А С-луддитам пора выйти из зоны комфорта и выучить, наконец, С++.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 13:07 
Только какой в этом смысл, если за питон больше платят?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Ананас , 17-Дек-21 18:05 
Что, аж две миски?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 18:06 
Сомневаюсь что-то. Можно пруфлинк?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 21:31 
https://leonardo.osnova.io/6f458341-e3ff-5373-907e-f19f5a231.../
Не то чтобы сильно больше, но дорасти до большей зп на питоне можно быстрее, так что профита больше учить питон, а не дидовские кресты.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 21:33 
А если питонщик умеет ещё и на сях лабать, то у него есть хороший шанс стать незаменимым, попадя в правильно место)

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 21:33 
А если питонщик умеет ещё и на сях лабать, то у него есть хороший шанс стать незаменимым, попадя в правильно место)

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 18-Дек-21 18:12 
Это что, шутка какая-то? Во-первых, по ссылке зарплата на Python и на С++ абсолютно одинаковая, а не просто "не сильно больше". Во-вторых, цифры неправдоподобные. Зарплата программиста 130 000 рублей? Это одних джунов и студентов опрашивали что ли? Я ожидал увидеть цифры в районе 400 000. В-третьих, что за сайт левый такой и только картинка, почему не дать ссылку на оригинал, статью на Хабре? Наверное потому что там уже напихали авторше в панамку по поводу совершенно неправдоподных цифр?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 18-Дек-21 20:53 
> Я ожидал увидеть цифры в районе 400 000.

На hh.ru если выставить фильтр на 400+, вакансий для питонистов 262 находится, а для с++ 125.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 18-Дек-21 23:03 
Ну и что, это же не показатель средней зарплаты. Если так любишь hh.ru, вот тебе статья про высокооплачиваемые работы:

https://hh.ru/article/28335

C++ там в первом разделе в топе, а Питон в последнем разделе на последнем месте.

И погоди, а то что ты лажанулся с каким-то там leonardo.osnova.io уже как бы и не считается? Признать своё лажание не хочешь?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 19-Дек-21 11:55 
> ты лажанулся

Что за агрессия? Ты приплюснутый что ли82808 и тебя это задело? Средняя зп по методике расчёта это float, если ты считаешь что из 2х float с одинаковой целой частью один не может быть быть больше, а другой меньше, то у меня для тебя плохие новости.
> C++ там в первом разделе в топе, а Питон в последнем разделе на последнем месте.

И что мне это должно сказать? За "топовую" вакансию на плюсах и 400к не предложили, тогда как на питоне таких по 400+ 262 шт находится.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 19-Дек-21 19:27 
Просто непонятно как говорить с человеком, который то "забывает" свои предыдущие несостоявшиеся аргументы, то передёргивает и сравнивает цифры из разных статей. Наверное никак.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 17-Дек-21 08:11 
>>печально
> Да, жаль, что не на Си.

Ну почему же

std::string get_realpath(std::string_view path) {
  char buf[8192];
  if (!realpath(std::string(path).c_str(), buf))
    return std::string(path);
  return buf;
}


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 19:08 
> Ну почему же
> std::string get_realpath(std::string_view path) {
>   char buf[8192];
>   return buf;

Тут "спрятанно" какое-то копирование buf в возвращаемый std::string (которого не будет в си)?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 19:40 
Да, будет копирование. Но его можно было бы избежать, сделав buf изначально типа std::string и передавая buf.data() в realpath().

Но это всё такое крохоборство походу. В Java и Python строки неизменяемые, там любое изменение строковой переменной это создание нового строкового объекта, ещё дороже получается. Программисты на других языках смотрят на этот подсчёт крох со смехом.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 20:33 
> В Java и Python строки неизменяемые, там любое изменение строковой переменной это создание нового строкового объекта, ещё дороже получается.

Вообще-то, еще во втором питоне для "объемной" работы со строками были MutableString и StringIO, в Java - тот же StringBuffer.



"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 21:05 
Это всё так, но мы друг другу не противоречим. MutableString, StringIO и StringBuffer - это не строковые переменные. Это объекты, содержащие массивы байтов. В них надо загонять текстовые данные, копированием, а потом полученные строки в строковые переменные извлекать, тоже копированием. Двойное копирование то бишь. В С++ тоже такое есть, называется std::stringstream.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 19:52 
> копирование ... которого не будет в си

А в С был бы возврат указателя на локальный буфер в функции, где после выхода из функции и вызова парочки других функций, любой мусор оказаться может. Зато без копирования, да.

Это вообще распространённая проблема в С. Ошиблись при работе с памятью, потом из неправильного места в памяти читаем мусор и радостно исполняемся некоторое время, пока проблема не всплывёт вообще в другом месте кода. Трудно дебажить такое. В С++ такие ошибки встречаются гораздо реже.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 20:17 
>> копирование ... которого не будет в си
> А в С был бы возврат указателя на локальный буфер в функции,
> где после выхода из функции и вызова парочки других функций,

Я в курсе, потому и спросил.
>  Зато без копирования, да.

Угу, зато есть такие вот неявные кунстштюки, вместо (условного) return str::string(buf).


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 20:45 
Такое неявное конструирование объектов очень удобно. И это не является какой-то секретной фичей, это базовая фича, о которой знают все программисты С++. Можно конструировать явно, std::string(buf) является валидной конструкцией. Можно пометить конструктор как explicit, тогда неявное конструирование будет запрещено.

А в функциональных языках вообще return неявный, возвращается последнее вычисленное выражение, тоже очень удобно, можно писать короткие функции как "a + b", без return.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 22:04 
> Такое неявное конструирование объектов очень удобно. И это не является какой-то секретной
> фичей, это базовая фича, о которой знают все программисты С++.

(Не)явное удобство явно переоцененно, но это вкусовщина, о которой я не вижу смысла спорить.

> А в функциональных языках вообще return неявный, возвращается последнее вычисленное выражение,

Не соглашусь. Это - игра словами (просто потому что нет ключевого слова return).
Основной момент: там, где нет return и возвращается последнее выражение - все вполне себе явно. Тем более, функциональный стиль, сопоставление с образцом и "все есть выражение" (expression), с упрятыванием "не-выражений" с побочными эффектами - куда подальше в монады и ко, (т.е. еще и код структурированн по другому).

Для "императивных" ЯП тут вспоминается "single entry, single exit" из "древнего" "structured programming".

Неявно - это к ЯП, где возможен и явный "return foo" и возврат последнего выражения (например ruby, rust - где есть "типа фунциональщина и сбоку бантик").


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 18-Дек-21 09:18 
>> копирование ... которого не будет в си
> А в С был бы возврат указателя на локальный буфер в функции,

Смотрим man 3 realpath

       char *realpath(const char *path, char *resolved_path);

...

       Получившееся  имя  сохраняется  в  виде  строки (с null на конце) не длиннее чем PATH_MAX байт в
       буфере, указанном в resolved_path. Конечный путь не содержит символьных ссылок и компонентов /./
       или /../.

       Если  значение  resolved_path  равно NULL, то realpath() выделяет буфер размером PATH_MAX байт с
       помощью malloc(3) для хранения полного пути и возвращает указатель  на  этот  буфер.  Вызывающий
       должен освободить буфер с помощью free(3).

Т.е. в Си убрали бы char buf[8192] и вернули указатель на кучу.

Что бы в Си++ не заниматься крохоборством с магическими числами вместо PATH_MAX, можно было конструировать std::string из аллоцированого ф-цией realpath() результата?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 18-Дек-21 18:54 
> Т.е. в Си убрали бы char buf[8192] и вернули указатель на кучу.

В таком случае вызывающий get_realpath() должен деаллоцировать результат с помощью free(). А что если get_realpath() вернёт не результат realpath(), a path, полученный параметром? Он то вообще непонятно где находится и как аллоцирован. Тогда мы имеем или double free, или попытку сделать free() на указатель на стеке. С сопутствующими проблемами безопасности. Значит нельзя просто возвращать path, а надо сделать ему strdup(), получается одно копирование заменили на другое. Ты можешь сказать, ну тогда надо менять всю функцию, чтоб копирования не было. Или вообще её убрать и те 2-4 строчки в вызывающий код вписать. Но тогда можно и на С++ тоже функцию полностью переписать "по правильному". И вообще теряется весь предмет разговора.

> Что бы в Си++ не заниматься крохоборством с магическими числами вместо PATH_MAX, можно было конструировать std::string из аллоцированого ф-цией realpath() результата?

Да, запросто.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 19-Дек-21 10:26 
>> Т.е. в Си убрали бы char buf[8192] и вернули указатель на кучу.
> В таком случае вызывающий get_realpath() должен деаллоцировать результат с помощью free().

Да. Точно так же в Си++ будет деаллоцирован буфер std:string. Только в Си все освобождения явны.

> А что если get_realpath() вернёт не результат realpath(), a path, полученный
> параметром? Он то вообще непонятно где находится и как аллоцирован. Тогда
> мы имеем или double free, или попытку сделать free() на указатель
> на стеке. С сопутствующими проблемами безопасности. Значит нельзя просто возвращать path,
> а надо сделать ему strdup(), получается одно копирование заменили на другое.
> Ты можешь сказать, ну тогда надо менять всю функцию, чтоб копирования
> не было. Или вообще её убрать и те 2-4 строчки в
> вызывающий код вписать.

Ну да, в Си эта обёртка вроде как совсем не нужна.

> Но тогда можно и на С++ тоже функцию
> полностью переписать "по правильному". И вообще теряется весь предмет разговора.

Так и я о том. Вроде как переписали на Си++, но наполовину, в итоге там потенциально буфер переполняется.

>> Что бы в Си++ не заниматься крохоборством с магическими числами вместо PATH_MAX, можно было конструировать std::string из аллоцированого ф-цией realpath() результата?
> Да, запросто.

В общем, непонятна экономия. Если есть имя файла, значит его будут читать, а это всю "оптимизацию" с кучей перевесит.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 19-Дек-21 20:10 
> Только в Си все освобождения явны.

Хм, так пишешь, как будто это хорошо. Явны, значит замусоривают код и заставляют программиста всё деаллоцировать вручную, т.е. лишают автоматизации, заставляют следить чтобы и не забыть про деаллокацию, и чтобы она больше одного раза не произошла.

> Вроде как переписали на Си++, но наполовину,
> в итоге там потенциально буфер переполняется.

Да, не очень хорошо получилось. Но код на стыке языков часто таким бывает. Я не про потенциальное переполнение буфера, а просто про элегантность. Да и get_realpath() - это по сути С++ wrapper вокруг сишного API realpath(), а к врапперам требования по элегантности снижены, врапперы как раз и призваны локализовать неэлегантность в себе, предоставляя удобное API наружу.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 20-Дек-21 11:25 
>> Только в Си все освобождения явны.
> Хм, так пишешь, как будто это хорошо. Явны, значит замусоривают код и
> заставляют программиста всё деаллоцировать вручную, т.е. лишают автоматизации, заставляют
> следить чтобы и не забыть про деаллокацию, и чтобы она больше
> одного раза не произошла.

Так там кто-то хотел на Си, значит для него это хорошо.

>> Вроде как переписали на Си++, но наполовину,
>> в итоге там потенциально буфер переполняется.
> Да, не очень хорошо получилось. Но код на стыке языков часто таким
> бывает. Я не про потенциальное переполнение буфера, а просто про элегантность.
> Да и get_realpath() - это по сути С++ wrapper вокруг сишного
> API realpath(), а к врапперам требования по элегантности снижены, врапперы как
> раз и призваны локализовать неэлегантность в себе, предоставляя удобное API наружу.

Есть же std::filesystem::canonical().


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 18-Дек-21 09:21 
>> Ну почему же
>> std::string get_realpath(std::string_view path) {
>>   char buf[8192];
>>   return buf;
> Тут "спрятанно" какое-то копирование buf в возвращаемый std::string (которого не будет
> в си)?

Тут переполняется стек при "нестандартном" значении PATH_MAX.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:53 
Ну возьми да перепиши на раст.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено x3who , 16-Дек-21 12:27 
Точно, плесень надо писать на ржавчине

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 12:58 
Обрати внимание на исходники GCC, там уже много файликов на С++. Брат жив.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 13:25 
Это говорит только о том, что gcc -- не очень хороший компилятор

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 14:35 
> о том, что gcc -- не очень хороший компилятор

чего именно ? с++ или c ?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 19:57 
> Это говорит только о том, что gcc -- не очень хороший компилятор

Тебя обманули. gcc это вообще не компилятор! Это коллекция компиляторов.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 11:52 
А Шланг*, по этой логике, получается лучше?

*Шланг весь на C++.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено _kp , 16-Дек-21 14:21 
>>печально

Ну перепиши на Питон, и радуйся. С девушкой. Питон предоставит достаточно времени. ;)


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 16:24 
Если глянуть исходники, там типичная сишка по сути. Вот например: https://github.com/rui314/mold/blob/main/elf/arch-x86-64.cc
даже stl не используется.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 16:57 
ловите питониста, не различает си и си++

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 22:11 
кстати заметьте как ускорено дропают поддержку 32х бит арма

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 11:57 
Так он микроконтроллерах только и остался.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 19-Дек-21 19:41 
это тебе в отделе маркетинга подсказали ?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 00:27 
> template <>
> void GotPltSection<X86_64>::copy_buf(Context<X86_64> &ctx) {

Рили?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 00:42 
То что обычные сишные процедуры зачем-то в виде шаблонов оформлены, сути не меняет. Там за вечер этот 1% кода выкинуть можно и заменить сишными вызовами процедур и будет 100% сишка. А так пока 99% си 1% си++.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 17-Дек-21 08:15 
> То что обычные сишные процедуры зачем-то в виде шаблонов оформлены

Интересно, зачем?

    u8 *loc = base + rel.r_offset;

/// ...

    auto write8 = [&](u64 val) {
      overflow_check(val, 0, 1 << 8);
      *loc = val;
    };

/// ...

      write8(S + A);


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 08:56 
> auto write8 = [&](u64 val) {

Легко заменяется на вложенную функцию из GCC C расширения или макрос и дальше можно так же писать
write8(S + A);


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 12:24 
Только тогда теряется либо совместимость со стандартом, либо типобезопасность.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 12:58 
-stg=gnu99

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 18:08 
Вот и я про тоже. Нестандартные расширения GNU.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 17-Дек-21 12:36 
Наверное, я что-то уловил, но зачем там вообще лямбда. Вызывается однократно в теле той же функции, где определена.

    u8 *loc = base + rel.r_offset;

/// ...

#ifdef LLL
    auto write8 = [&](u64 val) {
      overflow_check(val, 0, 1 << 8);
      *loc = val;
    };
#endif

/// ...

#ifdef LLL
      write8(S + A);
#else
      overflow_check(S + A, 0, 1 << 8);
      *loc = S + A;
#endif



"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 18:11 
Может раньше неоднократно вызывалась, потом другие вызовы убрали. Да много причин может быть

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 17-Дек-21 18:36 
Многократно вызывается write32s. Там switch и write8 вызывается для R_X86_64_8. Больше, вроде, нет подходящих типов релоков. Далее идут прямые записи вида *(u64 *)loc = S + A; Вероятно, изначально хотел единообразие, но потом устал эти лямбды писать на каждый чих.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Ordu , 18-Дек-21 09:17 
> Интересно, зачем?

Возможно, просто как способ сделать код более читаемым. Возможно, как способ повысить maintainability кода инкапсуляцией -- операция write8 вынесена отдельно, и если ты хочешь изменить её, то вот она, тебе не надо весь код функции перелопачивать, выясняя где там мы в loc пишем. Кроме того, если ты присмотришься, тут неявно создаётся локальная переменная val инициализируемая значением S+A. Без этой переменной придётся писать S+A дважды, а это прям приглашает наступить будущих мейнтейнеров на грабли, чтоб они поменяли в одном месте S+A на что-нибудь ещё, а в другом месте забыли бы.

А может, как писали выше, задумка была в том, что таких операций будет много, и может их было когда-то много, а потом стало мало, но это же не повод удалять столь удачную функцию?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 18-Дек-21 09:47 
Неудачно процитировал, лучше весь код смотреть. Хотя бы это:

    switch (rel.r_type) {
    case R_X86_64_8:
      write8(S + A);
      continue;
    case R_X86_64_16:
      write16(S + A);
      continue;
    case R_X86_64_32:
      write32(S + A);
      continue;
    case R_X86_64_32S:
      write32s(S + A);
      continue;
    case R_X86_64_64:
      *(u64 *)loc = S + A;
      continue;
    case R_X86_64_PC8:
      write8s(S + A - P);
      continue;
    case R_X86_64_PC16:
      write16s(S + A - P);
      continue;
    case R_X86_64_PC32:
      write32s(S + A - P);
      continue;
    case R_X86_64_PC64:
      *(u64 *)loc = S + A - P;
      continue;
    case R_X86_64_PLT32:
      write32s(S + A - P);
      continue;
    case R_X86_64_GOT32:
      write32s(G + A);
      continue;
    case R_X86_64_GOT64:
      *(u64 *)loc = G + A;
      continue;

На остальное автор перестал писать лямбды. Наверное, устал мотать экран туда-сюда. :)
write8, насколько понимаю формат, негде больше переиспольовать.

> если ты присмотришься, тут неявно создаётся локальная переменная val инициализируемая
> значением S+A. Без этой переменной придётся писать S+A дважды, а это
> прям приглашает наступить будущих мейнтейнеров на грабли, чтоб они поменяли в
> одном месте S+A на что-нибудь ещё, а в другом месте забыли
> бы.

Вариант. И switch так красивее - все case по три строчки.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 18-Дек-21 15:39 
И switch так красивее - все case по три строчки.
Не, красивее было бы вместо rel.r_type передать указатель на функцию соответствующего write...() и свитч не нужен был бы.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 18-Дек-21 16:53 
rel.r_type читается из объектника, а указатель откуда возьмётся?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Crazy Alex , 19-Дек-21 20:15 
Ну, в принципе если проверку вадиности значения отдельно вынести - можно и по табличке сделать, но подозреваю, что кода будет больше, маинтайнить станет менее удобно, а толку - никакого, этот свитч, скорее всего, во что-то подобное компилятором и будет преобразован

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 21:18 
> template <>
> void GotPltSection<X86_64>::copy_buf(Context<X86_64> &ctx) {
> Рили?

Подозреваю, что причина использование темплейтов в том, что линкер похожим образом обрабатывает ELF-файлы разных архитектур. Похожим образом, но не абсолютно одинаковым. То есть многие функции обработки выглядят одинаково, но не все. Те, которые разные - реализованы в виде специализации темплейта для конкретной архитектуры, например X86_64, что мы и наблюдаем в этом файле.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 09:47 
Какой-то трешекод. Вообще ничего не понятно - одни магические константы вхардкожены. У нас бы он код ревью не прошел. 🤣

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 13:10 
> ничего не понятно

У приплюснутых такое в порядке вещей.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 19:14 
> Вообще ничего не понятно

Так матчасть изучай. GOT с PLT парсить, да релокации осуществлять - это тебе не формы клепать.

> одни магические константы вхардкожены

Магические константы аккуратно прокомментированы и локализованы либо в константных массивах, либо в специальных функциях для этих констант. Этот как раз таки противоположность хардкода. А также используются много где исплоьзуются символьные константы типа R_X86_64_RELATIVE. Зря наговариваешь на код в общем.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:16 
> может применяться

Ну и ладненько. Не хватало еще стопицотзависимого крестового линкера


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:17 
А парень не промах. Сначала наковырял lld потом сделал mold и вышел в профит. Красавчик.
Интересно, а правильно ли он компонует ? Новые баги добавляет ?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Адмирал Майкл Роджерс , 16-Дек-21 13:08 
> Новые баги добавляет ?

Это конфиденциальная информация.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Генерал Пол Накасоне , 16-Дек-21 15:52 
Кем вы себя возомнили?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Пал Ко Водетс , 16-Дек-21 16:13 
Директорский состав Каспийского моря. Ваши документы пожалуйста

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено макпыф , 16-Дек-21 18:06 
> Интересно, а правильно ли он компонует ? Новые баги добавляет ?

Не знаю, но судя по новости ff chromium и шланг собрались, следовательно работать должен.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 20:36 
Ты случаем не мейнтейнер рача?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено макпыф , 16-Дек-21 21:16 
> Ты случаем не мейнтейнер рача?

Нет


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 21:24 
> Нет

У них такая же политика "собралось значит работает".


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено макпыф , 16-Дек-21 21:39 
> У них такая же политика "собралось значит работает".

У меня по другому. Получилось собрать и запустить program --help путем лютейших костылей и не взираю на тысячи ошибок - все норм, все работает
А они патчи не любят


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним12345 , 16-Дек-21 11:23 
Адовы муки статических языков

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:40 
программа либо разрабатывается быстро, либо работает быстро. Привыкай, мой юный кодер пробельчиками.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:50 
> программа либо разрабатывается быстро, либо работает быстро, но только если разработана с умом

fixed


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено bergentroll , 17-Дек-21 01:05 
А если без ума, то и разрабатывается быстро, и работает быстро. Но такая чушь получается!

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Простоник , 17-Дек-21 07:35 
Если бы это было так, мир был бы прекрасен. Но увы мы видим программы, которые разрабатываются за непредсказуемое, часто очень длительное время, многократно превышающее первоначальные планы, медленно работающие,  содержащие массу ошибок, включающие утечки памяти. Здравствуй Rust.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:42 
Там, где на этапе компоновки заканчиваются муки статических языков, начинаются муки динамических погромистов.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 22:46 
Вы давно указатель на null проверяли?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 17-Дек-21 08:26 
Указатель на Хиндли-Милнера?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 12:29 
После проверки на None не забудьте ещё проверить тип переменной

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Crazy Alex , 19-Дек-21 20:23 
Нахрена мне умный указатель проверять? Он либо содержит то, что должен либо не существует вместе со своим объектом-владельцем. Ну либо код писал идиот, а ревьюили задницей и позволили кому-то писать си-стайл.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:49 
так вроде бОльшая проблема это сама трансляция сколько сама сборка этих двух гиговых файлов происходит? Там ведь бесконечное дёрганье заголовков подстановка и трансляция их каждый раз

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено nobody , 16-Дек-21 12:19 
В C++ это решили (решат) добавлением модулей

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 17:50 
Ну отличная новость хотя и спустя 38 лет с момента появления языка. В любом
случае еще подождем....

Кстати если взять пионеров, то у многих это уже давно реализовано из коробки:
cargo, pip, go mod, maven и т.д.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено topin89 , 16-Дек-21 12:27 
Не совсем. На первой сборке очевидно, что на создание объектных файлов уйдёт много времени.
Потом правится и компилируется один .c/cpp файл в один объектный файл, и это быстро. А потом снова линковка сотен объектных файлов, и это медленно.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 17:47 
Это требует определенной культуры и организации разработки, а так же в целом хорошей работы системы (локального времени) если я правильно помню как там происходит сравнение изменений файлов.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Crazy Alex , 19-Дек-21 20:26 
Линковка - тоже не сахар, как гентушник говорю :-) на райзене 3700X какой-нибудь хромиум линкуется несколько минут, ну и память жрёт гигабайтами. Тут даже интереснее, удалось ли по памяти эту штуку менее прожорливой сделать

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено n00by , 20-Дек-21 11:36 
Толку мало от 7го Райзена, когда он в одном потоке линкуется. И это он ещё без lto собирается, в ungoogled-chromium можно оптимизацию включить и сравнить время :-)

        <flag name="optimize-thinlto">Whether to enable ThinLTO optimizations. Turning ThinLTO optimizations on can substantially increase link time and binary size, but they generally also make binaries a fair bit faster.</flag>
        <flag name="thinlto">Build with ThinLTO support. LTO (Link Time Optimization) achieves better runtime performance through whole-program analysis and cross-module optimization (highly recommended).</flag>


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 11:52 
>Mold написан на языке С++ (C++20) и распространяется под лицензией AGPLv3

Лучше бы тогда уж под проприетарной, раз в копирастию поиграть хочется.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено x3who , 16-Дек-21 12:29 
Тогда никто не подсядет

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 15:55 
ржавчина, плесень... кишечные паразиты на очереди?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 16:05 
символично и с издевкой закапывать опенсорс не запретишь

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено kusb , 16-Дек-21 16:53 
Хероптериксы

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Хероптерикс , 16-Дек-21 18:32 
Я бы попросил!

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено burjui , 20-Дек-21 10:39 
Это другое. Вот гнили ещё не было. Кстати, ничего так название - rot, осталось только придумать проект.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Андрей , 16-Дек-21 17:31 
Зачем было создавать новый проект, если можно было ускорить какой-нибудь старый, тем более что тогда это быстрее принесло плоды. В остальном очень интересует - а не диким ли распараллеливанием выигрыш достигается ? Ведь если так и если остальные компоновщики просто долбят однопоток..., то тогда опять же зачем было изобретать велосипед, если можно было добавить колёс старому ?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 17:52 
Андрей, привет. Трехколесный велосипед медленнее двухколесного. Пока, Андрей.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Мохнатый пись , 16-Дек-21 18:01 
Почему тогда автомобили на четырёх колёсах в основной массе, а не хотябы трёх?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 18:23 
Думаешь если добавить к ним еще парочку колес, они станут быстрее? Напоминаю, что больше 4 колес обычно имеют всякие грузовики. А в будущем все колеса уберут, потому что машины будут летающими.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 20:00 
А почему у самолётов и вертолётов не уберут колёса?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено x3who , 17-Дек-21 14:27 
Нужны для совместимости с автомобилями.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 19:11 
>Почему тогда автомобили на четырёх колёсах в основной массе, а не хотябы трёх?

А почему телеги  и кареты на четырёх колёсах? А почему коляски и колесницы на двух колёсах? Наверно потому-что так рационально.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено funny.falcon , 16-Дек-21 20:18 
Мотоцикл можно назвать автомобилем на двух колёсах. И при одинаковой мощности двигателя, мотоцикл обычно быстрее (если сравнивать лучшие модели).

Дополнительные колёса дают не скорость, а удобство, безопасность и грузоподъемность.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено _ , 17-Дек-21 00:08 
Дополнительные колёса (если употребить всю упаковку сразу) дают чуЙство гениальности :)
И вот ты уже объясняешь на оппа-нете чем мацатыкал от бибики отличается :)

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Ordu , 17-Дек-21 04:20 
> В остальном очень интересует - а не диким ли распараллеливанием выигрыш достигается ? Ведь если так и если остальные компоновщики просто долбят однопоток..., то тогда опять же зачем было изобретать велосипед, если можно было добавить колёс старому ?

Если выигрыш достигается диким распараллеливанием, то сам бог велел делать это новым проектом. Распараллелить программу, написанную под однопоток -- это гарантированно получить тысячи memleak'ов, use-after-free, data-races, race-conditions и прочих. Их будет столько, что ты никогда их не одолеешь, годами будешь сидеть отлавливать, и никогда не отловишь все.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено burjui , 20-Дек-21 10:44 
Не говоря уж о том, что существующие линкеры поддерживают куда больше архитектур, даже старых и ненужных, и переписывать пришлось бы огромное количество кода. А в mold всего 3, что намного проще для proof-of-concept и первого релиза.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено all_glory_to_the_hypnotoad , 17-Дек-21 15:28 
Часто чтобы просто донести патч до апстрима в СПО проектах нужно ждать несколько лет пока правильно расставишь скобочки, напишешь кучу тестов и сделаешь три раза Ку перед мейнтейнером. А с радикальными переработками процесс вообще может никогда не сойтись.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Crazy Alex , 19-Дек-21 20:29 
Насчёт "ку" - такое возникает ровно в двух случаях: либо апстрим мёртв либо ты пытаешься рассказать "как надо" и это с точкой зрения апстрима вообще никак не совпадает.

А правильно расставить скобочки и написать тесты придётся в любом случае, если, конечно, говнокод не устраивает


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено eganru , 16-Дек-21 18:11 
Не так давно сталкивался с особенностями работы lld: как оказалось, он в силу однопроходной архитектуры не может работать с r_riscv_align.

Переключив линкер с lld на gnu ld я обнаружил, что у них немного разный синтаксис.

Исследуя этот вопрос добрые люди скинули ссылки на несколько статей, однако из них не следовало, что в ближайшее время ситуация как-то изменится.

Страшно если в итоге получим n линковщиков с разными функциональностью и синтаксисом.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 21:30 
Я кстати не вижу сравнения с bfd. Gold всегда славился своими дорогостоящими оптимизациями (LTO), для чего он и был придуман изначально, но он мало совместим с современным софтом. Ядро кстати тоже не собирается больше голдом, он давно мёртв, и это финиш. Не могу придумать причин использовать ldd.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 21:30 
>ldd

lld конечно


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 23:39 
lldilldo

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 19:51 
О да, для сборки хипстерских WebAssembly, где сплошные статические библиотеки линкуются в один мегаэкзешик и уходят на это целые минуты, новый линковщик в замен тормозного lld будет очень кстати!

На десктопе такой ерундой нет смысла заниматься - с динамическими библиотеками таких проблем не замечается...


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 22:24 
Вы хромом на десктопе пользуетесь? Вот его сборка в т числе и ускорилась.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 22:48 
А что, хромом уже нельзя пользоваться, если не собрал сам на своём десктопе?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 17:59 
С таким подходом можно ничем не заниматься. Можно пользоваться уже написанными скомпилированными программами. Зачем развивать языки программирование, ИДЕ и компиляторы?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 16-Дек-21 23:00 
С++20 конечно рулит, но такая вещь, как плесень, просто обязана быть на ржавчене, как же иначе?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено szt1980 , 17-Дек-21 00:00 
>Проект признан готовым для рабочих внедрений и может применяться в качестве более быстрой прозрачной замены GNU linker на Linux-системах

Точно готов? И поехавшие линкер-скрипты работают? А если проверить?


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 03:03 
И снова не на расте)) лол

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 17-Дек-21 03:04 
Растом то вообще хоть кто-то пользуется?

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено all_glory_to_the_hypnotoad , 17-Дек-21 15:24 
> GNU gold тратится 53 секунды, LLVM lld - 11.7 секунд, а Mold всего 2.2 секунды ... распространяется под лицензией AGPLv3 ... Подобный выбор объясняется желанием получить финансирование разработки

Все просто будут использовать lld ибо 3 сек по сравнению с 12 не такой большой профит как 12 с 53.


"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Ordu , 18-Дек-21 09:10 
Это _огромный_ бонус, если ты вносишь мелкие правки в сорцы, компилируешь, запускаешь, смотришь что получается, вносишь ещё какие-то правки. Три секунды задержки -- это слегка раздражающая вещь, 12 секунд задержки -- это повод встать и пойти за чаем. 53 секунды -- это просто ппц, это повод менять методологию программирования, снижая частоту пересборок.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 23-Дек-21 08:43 
А с lto оно как работает? А то на lto все тормозят, однако оптимизации крутые, кучу кода удаляет без каких либо побочных эффектов. И компилять с отдельными дебажно девеловскими опциями это фуфу, вылезает иногда нежданчиками.

"Первый стабильный релиз компоновщика Mold, развиваемого разр..."
Отправлено Аноним , 23-Дек-21 08:41 
> автор готов продать права на код для перелицензирования под разрешительной лицензией,
> такой как MIT, или предоставить отдельную коммерческую лицензию для тех, кого не устраивает AGPL.

Правильный подход к корпорациям и менеджерской швали :)