Remix.run Logo
▲ Mold Linker Version 3.0.0 Release – Rewritten in Rust(github.com)
146 points by roflcopter69 7 hours ago | 53 comments
▲lrvick an hour ago | parent | next [-]

The linux distribution I co-maintain uses mold as our bootstrap linker to bootstrap rust itself, and it saved us -hours- on long version-by-version build chains. Mold being in c meant we could build it very early and use it as the default linker distro wide and enjoy build speedups everywhere.

Now sadly we will have to fork and maintain the c version as mold2 forever.

Rust is not actually the right tool for all problems.

▲someonebaggy an hour ago | parent | next [-]

That's your choice and your responsibility. You don't get to bind upstream, at least not without paying money. You can't say Rust is a bad solution, just because you developed a bootstrap chain that happens to find useful the fact that mold is written in C.

▲Imustaskforhelp an hour ago | parent [-]

I do understand what you are trying to say, but I think that this fails to be kind to Irvick and the other maintainers of the stage0 project who are actually being quite underfunded (someone like OAI should fund them in the name of security!)

So asking them to pay money is well.. not quite the solution.

What can happen as it often happens, is this, Mold creator created the project, Stage0 found it useful, Mold ports itself to rust, Stage0 now founds it not useful, Stage0 can comment on the new update and be slightly disappointed and comment how they would've preferred to not rust in this particular case for them.

Yes this doesn't prevent mold from changing to rust or anything as it was shown but I guess we can allow the ability for Irvick to drop a comment I guess without saying that's your responsibility while they are just being maintainers of the open source and an underfunded/mostly volunteer one of work at that.

Also, @Irvick, stage0 is extremely cool, I hope that a lot more companies sponsor the work that stage0 contributors are doing. I think that it can help the supply-chain issues that the industry is facing at, and is honestly just a really cool idea and I love reading your comments and thank you!

▲MayeulC 15 minutes ago | parent | prev | next [-]

I have been thinking about Rust bootstrapping recently. Couldn't a Rust compiler without borrow checker be put together relatively easily?

Assuming the source code contains no issues (which can be checked later once the Rust compiler is built), one could leave that piece behind, and take the shortest path from .rs to executed code (C transpilation, or even an interpreter).

▲karavelov an hour ago | parent | prev | next [-]

Why not use LLD for linking Rust? You already must have the LLVM for Rust to be buildable, so that do not add any dependency.

▲n8henrie 40 minutes ago | parent | next [-]

Agreed -- not my wheelhouse, but couldn't you just build rust earlier in your process using LLD, then build mold, then build everything else?

Would that meant that building rust is slower, but everything else is the same, and you don't have to maintain a fork of another complex project?

▲as-182 an hour ago | parent | prev [-]

Because mold is faster. Linking is a significant bottleneck when building large projects.

▲mort96 30 minutes ago | parent [-]

But we're talking for bootstrapping Rust here.

▲Orphis 29 minutes ago | parent | prev | next [-]

It seems like you would benefit from having reproducible and hermetic builds with a good caching layer so you don't do the same work again and again.

Then you can just use the latest built version to build mold and the next version of rust.

▲nicce an hour ago | parent | prev | next [-]

If the need is well justified, maybe there is great chance to ask adding #[no_mangle] and extern C support? Since release is very fresh. If that is causing the problem. Or is some dependency the issue?

▲well_ackshually 37 minutes ago | parent | prev | next [-]

>Rust is not actually the right tool for all problems.

"my problems (that are not mold's) are not solved by mold. How dare mold make those decisions?"

Maybe you should rewrite more of your linux distribution in rust so it's available earlier in the build process and get back to it being the default linker.

▲jacquesm 28 minutes ago | parent [-]

They were solved by mold. And then mold decided to un-solve them.

▲well_ackshually 23 minutes ago | parent [-]

No, they were never one of mold's goals. You don't get to assign solutions to people _and then blame them_. Hyrum's Law being a load bearing part of your infrastructure isn't Mold's problem.

▲jacquesm 18 minutes ago | parent [-]

I can't really agree with that. If you ship your linker with a disclaimer saying 'don't use this for early stage stuff, one day we might decide to rewrite the whole codebase in a language that won't be available early enough' then you'd have a point. But if you didn't that is precisely the kind of use case where mold shines, and so inevitably it will be adopted. Your downstream should be precious. At a minimum you should communicate such intentions, do so timely and hear what others have to say, even if afterwards you decide to push on.

▲jstarks 3 minutes ago | parent [-]

What? Why would mold be particularly valuable for early stage compilation, to the point that you’d explicitly cater to that user base?

▲DetroitThrow an hour ago | parent | prev [-]

I'm a bit confused why a decision to decrease the maintenance burden of Mold by switching languages makes Rust the wrong tool here? Fearless concurrency sounds like a huge benefit for what they're doing, given the resources they have.

▲compiler-guy an hour ago | parent [-]

It's simply an ordering problem. When building the entire world from scratch, usually the C and C++ toolchains are built near the very first, and Rust toolchains built somewhat later. Anything written in Rust must come after the Rust toolchain is built. You need a linker as part of your C++ toolchain, so it must be written in a language ready to go at that point. If it is written in C, you are done. If it is written in Rust you have to wait. So a Rust-based linker can no longer be used from that very, very early C bootstrap.

It's not a big deal for normal users, where you have Rust ready to go. Kind of a bummer in this case, but this is a specialized one.

▲veber-alex 36 minutes ago | parent [-]

Can't you just use a statically linked mold binary for the initial bootstrap, just like you use some kind of pre-existing, basic C compiler?

▲compiler-guy 32 minutes ago | parent [-]

You could. But now you are trusting an entirely new toolchain that can build the Rust-based linker, even if it is statically linked. This toolchain is much larger than a comparatively small and much more easily understood C bootstrap toolchain.

This effectively triples or quadruples (maybe even more) the amount of code you need to trust for the cold bootstrap.

▲Aissen 3 hours ago | parent | prev | next [-]

I expected this to be a multi-months rewrite, not 3 weeks. I almost forgot we live in the agents era now.

Edit: this seems to have been cooking for a while when the first commit dropped: https://github.com/rui314/mold/commit/f41bfcd5c72ca30cce6498...

▲chilipepperhott 16 minutes ago | parent [-]

Was the conversion assisted? I get the sense that Mold's author is an extremely competent guy and it would be quite feasible for someone like him to do it on his own.

▲awoimbee 2 hours ago | parent | prev | next [-]

So what differentiates mold from wild now ? Is wild using different data structures?

(Wild is another fast linker, that only supports Linux)

▲vlovich123 an hour ago | parent [-]

Wild's primary purpose is incremental linking - I guess now the primary difference is a race + subtle differences in performance between projects.

▲uncle_kostya 3 hours ago | parent | prev | next [-]

I'm curious about motivation - bounds checks for corrupted inputs seems like it would be one, but it also seems that fixing corrupted input handling in a C/C++ code base would not be too hard, and probably less of an effort? So why did you choose the rewrite?

And second, did you use any AI tools for the rewrite?

▲fotcorn 3 hours ago | parent | next [-]

> fixing corrupted input handling in a C/C++ code base would not be too hard

The best programmers on the planet have tried and failed with this task for 50 years now, so I don't think this is true.

The main disadvantage of Rust right now is not supporting some more obscure platforms, but because mold wouldn't support them anyway I don't see that as a problem.

▲embedding-shape 3 hours ago | parent [-]

> The main disadvantage of Rust right now is not supporting some more obscure platforms

Last time I checked, I got impressed by the wide platform support, once you go down the tier list (https://doc.rust-lang.org/nightly/rustc/platform-support.htm...). What "obscure platform" specifically are you thinking about, that is currently missing from those lists?

▲fotcorn 2 hours ago | parent | next [-]

Just to be clear, I think this is a very small disadvantage. GCC and therefore C/C++ supports some old stuff like SuperH, Intel Itanium, PA-RISC and a bunch of microcontroller archs that LLVM does not.

However, there is now a Rust codegen plugin for GCC, so even this disadvantage is now basically moot.

Rewrite all the things!

▲torginus 3 hours ago | parent | prev [-]

yeah this makes no sense to me. Why would Rust limit the LLVM backend's ability to generate code for a particular platform?

▲panzi 3 hours ago | parent | next [-]

I think the claim is that GCC supports a few obscure platforms that LLVM doesn't. Don't ask me which, that is just the claim that I heard multiple times. So it's not Rust that limits platforms, but LLVM. And they say the GCC backend efforts of Rust are meant to deal with that.

▲bkallus 2 hours ago | parent [-]

> Don't ask me which

There are many. Two big ones are Alpha and PA-RISC. NetBSD and Linux continue to support both. Linux distro choices are pretty much limited to Gentoo though.

▲steveklabnik 2 hours ago | parent | prev [-]

1. You've got the causality backwards. LLVM backends don't come for free, you have to write code to enable support for them.

2. LLVM does not support as many backends as GCC does, so even if you did get 100% of the LLVM supported backends up and running, you'd still be missing some.

▲saghm 3 hours ago | parent | prev | next [-]

My very naive understanding is that a part of what makes mold fast is concurrency, which I'd expect to be a lot more error-prone in C/C++. Not having to worry about data races might give more confidence with trying out more complex techniques for how to split up work in a way that ends up making things faster

▲someonebaggy an hour ago | parent | prev | next [-]

It's possible to write safe code in C or C++ but it's extremely difficult to read existing code and prove it's safe, without using as much effort as it takes to write it in the first place. This includes the code you wrote last month whose surrounding code has changed. And you have to be right every time while the attacker only needs you to be wrong once.

▲pornel 3 hours ago | parent | prev | next [-]

I suspect fearless concurrency is another motivating factor. Better perf can be achieved by squeezing more parallelism, but without borrow checking it's difficult to do fine-grained parallelism correctly.

▲nine_k an hour ago | parent | prev | next [-]

> in a C/C++ code base

It's like "in a Zodiac boat / aircraft carrier navy". This customary putting C and C++ into the same bucket is as amusing as it is unproductive.

▲pjmlp 43 minutes ago | parent [-]

Unfortunately too many folks still do C style programming in C++.

▲LoganDark 3 hours ago | parent | prev [-]

> And second, did you use any AI tools for the rewrite?

IMO, given the recent commits: almost certainly.

▲mi_lk an hour ago | parent | prev | next [-]

Damn. I thought Zig would be a perfect rewrite language for Mold since it's a better C in many ways

▲vlovich123 an hour ago | parent | next [-]

Zig makes you choose either safe or fast, not both. With Rust you can get both (generally).

▲Zambyte an hour ago | parent [-]

Zig makes you choose that at build time. You can use safe builds for development to catch bugs, and fast builds for release. You can even use safe builds in of the release, and optimize hot paths with fast builds.

In practice, projects written in Zig very much can choose both.

▲bhaak 28 minutes ago | parent | next [-]

You make it sound as if all bugs could be catched in development builds.

▲pjmlp 44 minutes ago | parent | prev [-]

Still doesn't have a good answer for use after free, although the allocators on the last release might help into that regard.

▲p-e-w 35 minutes ago | parent | prev [-]

When choosing a language, people don’t only look at language features but also at community adoption, the library ecosystem, industry backing etc.

Zig isn’t even in the same league as Rust regarding these things. Zig may still be around and active 10 years from now, Rust is guaranteed to be.

▲rvz 2 hours ago | parent | prev | next [-]

Software X now rewritten in Rust™ is the new sales pitch.

▲perching_aix 2 hours ago | parent [-]

new???

▲asjq178 an hour ago | parent | prev | next [-]

I don't want a slop linker. Why are people selling out their projects?

▲IshKebab 22 minutes ago | parent | next [-]

The days when AI always means slop are gone. It still often does, but the latest models can be used to get very high quality code in many situations. I haven't checked the code here but I would be surprised if it's bad.

▲iTokio an hour ago | parent | prev [-]

This is NOT a slop linker, Mold is a reference in the world of linkers and this port is official.

▲as-182 an hour ago | parent | next [-]

https://github.com/rui314/mold/releases/tag/v2.42.1

"Recent advances in AI-assisted coding have made large-scale rewrites considerably more practical, but they do not eliminate those risks, and we do not take them lightly."

▲menaerus an hour ago | parent | prev [-]

Last time I checked it didn't make any difference or whatsoever when compared to lld so I would not go that far by saying "mold is a reference in the world of linkers" - made a test just few days ago on 10M LoC C++. So, rewriting the codebase in another language just because doesn't seem like an investment worth doing when there's much bigger fish to fry.

▲WhereIsTheTruth an hour ago | parent | prev [-]

It was transpiled, not rewritten, rewrite implies by hand

▲tialaramex an hour ago | parent | next [-]

If it was transpiled there would be what GNU calls a "preferred form" of the linker source in which it wasn't written in Rust.

This is true for - as an example - the WUFFS GIF decoder. You can get C which decodes GIFs and was transpiled from WUFFS, but that's awful code and nobody wants to modify that code, whereas the WUFFS source code for the decoder is fine.

When we look at rui314's changes to mold today after 3.0 release, they just modify the mold source code in Rust, as you'd expect if this was in fact now written in Rust.

▲dcre an hour ago | parent | prev [-]

No it doesn't.