I shaved off 10 MiB from my binary in 2 hours!

I made a program using Macroquad, then I built it in release mode, the binary was 63 MiB in size.

So I used cargo vendor to have a better look at Macroquad and one of its dependencies, glam.

I then started to delete code, like, lots and lots of code(about 30_000 lines of code); none of it affected my main project, some of it became ‘dead_code’ just by removing the pub keyword.

The result is that my project was unaffected and the binary went down to 52 MiB.

Is there a way to automate removal of unneeded elements from dependencies? This is potentially huge.

  • KillTheMule
    link
    fedilink
    arrow-up
    7
    ·
    4 hours ago

    Actually, dead code eliminination should do the trick, if you’re compiling a binary at least (same for a library I think, but there could be re-exports there). Did you compile in release mode?

      • Doods@infosec.pubOP
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        4 hours ago

        This really doesn’t seem to do the trick, the binary’s still at 63MiB.

        Also "fat" and true are identical.

        Edit: I’m not sure I replied to the right person, ignore this.

      • KillTheMule
        link
        fedilink
        arrow-up
        2
        ·
        3 hours ago

        Sure, but isn’t this in a dependency? Can’t be reached when only importing your crate anyways? And if you’re building a binary, I don’t think this could really considered exported, is what I mean :)

        • Doods@infosec.pubOP
          link
          fedilink
          arrow-up
          1
          ·
          3 hours ago

          Yes that’s exactly what I want. The compiler should stop considering it accessible.

    • quilan@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      4 hours ago

      I don’t recall what the default behavior is with the linker, but it might also benefit from at least thin LTO.

    • Doods@infosec.pubOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      4 hours ago

      Yes, I am using both LTO and release mode, I can show you:

      [profile.release]
      opt-level = 3
      codegen-units = 1
      panic = "abort"
      strip = true
      lto = true
      

      cargo build --release

        • Doods@infosec.pubOP
          link
          fedilink
          arrow-up
          2
          ·
          edit-2
          4 hours ago

          Should I bring it up to the ‘min-sized-rust’ working group or the forums or something?

          • TehPers@beehaw.org
            link
            fedilink
            English
            arrow-up
            1
            ·
            1 hour ago

            Yes. This behavior seems strange, so either an explanation or investigation by a compiler dev seems like it would be helpful.