Skip to content

Commit

Permalink
newlib: add installation of libgloss for embedded targets
Browse files Browse the repository at this point in the history
I was trying to get an embedded RISC-V toolchain working, by
following pretty much a documented workflow:

```
pkgsCross = import pkgs.path {
  localSystem = pkgs.stdenv.buildPlatform.system;
  crossSystem = {
    config = "riscv32-none-elf";
    libc = "newlib-nano";
    gcc.arch = "rv32im";
  };
};
```

This is supposed to work for compiling programs that target
"bare-metal". But when I tried to compile my project, GCC complained
that it can't fild `-lgloss`. If you're curious what libgloss is, in
very simple terms it's a glue layer that allows you to provide
implementation for the bare minimum functionality that would get the
rest of the libc working. (such as `_sbrk`, `_open`, `_read` and
friends).

After digging into it for a while, I've figured out that newlib which
is shipped by nixpkgs doesn't contain libgloss as part of the build
resuts. So this isn't just me misconfiguring the search paths.

You may be wondering - why didn't anyone else find this issue? My
current guess is that nobody really uses this combination (newlib-nano
plus a bare-metal deployment). Most people who use the cross
toolchains likely target an operating system which provides syscalls
already and don't implement the stubs themselves.

If you really want to try and reproduce the bug, you need to pass this
as a flag to gcc: `--specs=nano.specs`.

Also, this bug is not really specific to NixOS, but happened in
ArchLinux as well. Here's a relevant bug report:
https://bugs.archlinux.org/task/66548. This is where I've found the
fix. Adding the fix in the way I did seems to fix the problem for
good.

The fix itself doesn't seem to be dangerous because in case libgloss
is absent, it would be skipped and not copied to the build results.
  • Loading branch information
knazarov committed Dec 22, 2024
1 parent 1dabc1f commit 1740ab9
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion pkgs/development/misc/newlib/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ stdenv.mkDerivation (finalAttrs: {
(
cd $out${finalAttrs.passthru.libdir}
for f in librdimon.a libc.a libg.a; do
for f in librdimon.a libc.a libg.a libgloss.a; do
# Some libraries are only available for specific architectures.
# For example, librdimon.a is only available on ARM.
[ -f "$f" ] && cp "$f" "''${f%%\.a}_nano.a"
Expand Down

0 comments on commit 1740ab9

Please sign in to comment.