Remove 32-bit architecture support #36659

issue l0rinc opened this issue on October 26, 2026
  1. l0rinc commented at 12:39 PM on October 26, 2026: contributor

    We have found few recent reports of 32-bit Bitcoin Core node use, yet we regularly run into problems with architecture-dependent types such as size_t.

    Previous discussions focused on shipping 32-bit x86 Linux binaries and ARM32 release binaries. Keeping source support retains the code and testing burden even after binary distribution ends.

    Given these recurring costs, I propose requiring a 64-bit target for Bitcoin Core node builds, including builds from source. That would let us retire the 32-bit node CI and release configurations and simplify node code that exists only to accommodate 32-bit targets.

    <details> <summary>Further examples of the work created by 32-bit support</summary>

    • #33709 and #33724 replaced architecture-dependent serialized-size arithmetic after the published crash mitigation. The review discussion explains the recurring need to reason about intermediate overflow and checked narrowing.
    • #35097 changed byte-unit literals because size_t prevented expressing larger storage sizes and limits on 32-bit targets.
    • #7848 fixed UTXO hash results that differed between 32-bit and 64-bit builds because a size_t counter wrapped.
    • #24214 made interpreter arithmetic independent of host width and reduced integer-sanitizer suppressions.
    • #34110 exposed a 32-bit Base58 overflow during wallet fuzzing and documents the additional effort needed to reproduce it.
    • #30307 needed different handling for file-position errors that occurred earlier on 32-bit systems.
    • #29415's review revisited architecture-dependent counter types during private-broadcast work. #32497's review compared arithmetic across compilers and 32-bit/64-bit targets for a small allocation optimization.
    • #34108 and #34136 required changing a functional test whose memory-accounting assumptions failed on 32-bit builds. #34132's review needed different storage-corruption test setup because the 32-bit database path behaved differently.
    • #28531's test discussion describes the difficulty of maintaining memory-usage expectations across both widths. #35773 needed a sanitizer suppression for intentional hash truncation on 32-bit targets.
    • #16096 raised declining developer testing and assumptions about size_t, time_t, and long. #35466 later repaired ARM32 IPC test coverage that had been skipped because a dependency was missing.
    • #27879, #31965, and the later hosting discussion show ARM32 execution restricting CI hardware and provider choices. #33302 needed an additional runner/cache exception.
    • #35546 revisited an i686 compiler choice originally made to avoid memory exhaustion. #31772 records another 32-bit compiler/build-mode combination causing an IPC test failure.
    • #3324 documents longstanding virtual-address-space exhaustion. #28906 and #28913 show ARM32 alignment assumptions causing a later memory regression.
    • #33333 needed arithmetic ordering chosen to avoid 32-bit overflow. #34692 retained a separate 32-bit cache default. The unmerged #35620 also illustrates separate database-cache behavior complicating proposed changes.
    • #2203, #2236, #438, and #439 needed large-file accommodations for 32-bit builds.
    • #29980 and #29985 required dependency changes during the time64 transition. #25573's ARM32 discussion describes extra toolchain and IPC work for static PIE.
    • #28096 found a nominally 32-bit build producing a 64-bit executable after losing target flags. #22889 and #22923 prompted additional 32-bit Clang coverage after compilation failures.
    • #18686, #19735, and #22464 are smaller examples of warning and narrowing fixes needed specifically for 32-bit targets.
    • #15939 and #22908 retired Win32 release and build configurations. #18104 stopped default i686 release builds while explicitly retaining source builds and CI, leaving later cleanup in #19745.
    • #23744 removed an i686 Android target that had been broken unnoticed for months. #24448, #24639, and #26075 show the compatibility work and eventual cleanup around discontinued i686 release builds.

      </details>

  2. willcl-ark commented at 12:48 PM on October 26, 2026: member

    Rough concept ACK.

    I suppose this should happen eventually at some point. It's kind of a shame that we can't deprecate tier 1 support but leave this working in self-compilation, but if we did that we'd not get any of the cleanup benefits of dropping support...

    What Pi devices do we think this would break support for? Seems like Pi 1 and 2 would be out of the mix, along with anybody running 32 bit Raspberry Pi OS on any device. Is that also your understanding?

    Do we have any other major 32 bit users that we know about?

  3. maflcko commented at 2:21 PM on October 26, 2026: member

    Do we have any other major 32 bit users that we know about?

    Maybe the website can be updated to drop the 32-bit bins from the html with a note that support may fully be dropped? (The raw file in /bin can remain for now)

    If no major users step up to motivate a continued maintenance effort, support can be fully dropped? Maybe in ~4.5 months after the 33.x branch-off?

  4. maflcko commented at 2:23 PM on October 26, 2026: member

    Also, if this is the new brainstorming issue, maybe #32375 can be closed?

  5. maflcko added the label Brainstorming on Oct 26, 2026
  6. maflcko added the label Linux/Unix on Oct 26, 2026
Linked (view graph)
#438 Fix O_LARGEFILE support on 32bit builds#439 Fix >2GB debug.log on 32bit and trunc'ing debug.log on all platforms#2203 Build with -D_FILE_OFFSET_BITS=64 on 32-bit Linux#2236 Support large files on 32-bit Linux#3324 Bitcoin is running 32 bit systems out of virtual memory#7848 Divergence between 32- and 64-bit when hashing >4GB affects `gettxoutsetinfo`#10120 util: Work around (virtual) memory exhaustion on 32-bit w/ glibc#12495 Increase LevelDB max_open_files#15939 gitian: Remove Windows 32 bit build#16096 RFC: Improving testing under the remaining supported 32 bit platforms#17504 Should we still ship 32-bit x86 Linux binaries?#18104 build: Skip i686 build by default in guix and gitian#18686 Fix -Wsign-compare warning on ARM 32-bit#19735 Fix -Wtautological-constant-out-of-range-compare warnings on 32-bit systems#19745 build: Drop back compatibility code for 32-bit x86 Linux binaries#22464 bench: fix 32-bit narrowing warning in bench/peer_eviction.cpp#22889 Compiling fails on 32-bit systems#22908 build: Drop 32-bit build configurations for MSVC#22923 test: Switch multiprocess to clang i686 build#23744 build, qt: Drop support for i686-linux-android host#24214 Fix unsigned integer overflows in interpreter#24448 Guix: Fix building for i686-linux-gnu#24639 guix: Drop code for the unsupported `i686-linux-gnu` host#25573 guix: produce a `-static-pie` bitcoind#25643 depends: compile FastFixedDtoa with -O1 to fix cross-arch reproducibility for arm32#26075 contrib: remove 32bit linux code from release scripts#27879 arm64 CI failure#28096 32-bit Linux: build flags lost with depends & overriden CC(X)#28531 improve MallocUsage() accuracy#28906 RAM usage regression in 26.x and master on ARM 32-bit#28913 coins: make sure PoolAllocator uses the correct alignment#29415 Broadcast own transactions only via short-lived Tor or I2P connections#29980 depends: Cross-compiling `qt` for `arm-linux-gnueabihf` fails#29985 depends: Fix build of Qt for 32-bit platforms with recent glibc#30307 fuzz: Fix wallet_bdb_parser 32-bit unhandled fseek error#31425 CI: Add Riscv bare metal job#31772 test: 32-bit Clang `ipc_test` failure at `-O0`#31965 Revisiting us self-hosting parts of our CI#32375 Stop shipping ARM32 builds for releases?#32497 merkle: pre‑reserve leaves to prevent reallocs with odd vtx count#32530 node: cap `-maxmempool` and `-dbcache` values for 32-bit#33302 ci: disable cirrus cache in 32bit arm job#33333 coins: warn on oversized `-dbcache`#33709 GetSerializeSize's return type should not be platform dependent#33724 refactor: Return uint64_t from GetSerializeSize#34108 mempool_updatefromblock.py fails on 32-bit (armhf, ...)#34109 refactor: Use uint64_t over size_t for serialize corruption check in fees.dat#34110 scriptpubkeyman fuzz target creates Base58 too large; Fails on 32-bit (armhf, ...)#34132 coins, dbwrapper: remove error catcher, make point-read failures fatal#34136 test: Allow mempool_updatefromblock.py to run on 32-bit#34692 Bump dbcache to 1 GiB#35041 descriptor: speed-up `Parse` (xpub/xpriv) in ~30%#35097 util: Return uint64_t from _MiB and _GiB operators#35202 ci: restore sockets in `i686, no IPC` job#35230 ci: Move --usecli --extended from i386 task to alpine task#35466 ci: run ipc functional tests in arm job#35546 ci: Use GCC consistently in i686 task#35574 Migrating Off GitHub#35616 refactor: Use u64 over size_t for all cache sizes to fix a 32-bit overflow#35620 leveldb: move unused block-cache budget to write buffers#35773 test: Suppress implicit-unsigned-integer-truncation:SaltedCoinsCacheHasher::operator()

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-10-26 16:51 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me