toolchain/60542: OBJDIR path leaked into installed debug library

"[email protected] via gnats" <[email protected]>
Newsgroups gmane.os.netbsd.bugs
Message-ID <[email protected]>
>Number:         60542
>Category:       toolchain
>Synopsis:       OBJDIR path leaked into installed debug library
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    toolchain-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Aug 05 19:05:00 +0000 2026
>Originator:     Thomas Klausner
>Release:        NetBSD 11.99.7
>Organization:
	
>Environment:
	
	
Architecture: x86_64
Machine: amd64
>Description:
I found this by accident while debugging a binary built with SSP.

(gdb) br read
 Function "read" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (read) pending.
(gdb) r
Starting program: /home/wiz/a

Breakpoint 1.1, 0x0000751ca08a03c0 in read () from /usr/lib/libc.so.12
(gdb) bt
#0  0x0000751ca08a03c0 in read () from /usr/lib/libc.so.12
#1  0x0000751ca0a1f334 in __ssp_protected__read (__fd=<optimized out>, __buf=0x751ca0843f80, __len=32768) at /usr/obj/amd64.gcc.20260803/usr/include/ssp/unistd.h:39
#2  __sread (cookie=0x751ca0cb1740 <usual>, buf=0x751ca0843f80, n=32768) at /usr/src/lib/libc/stdio/stdio.c:69
#3  0x0000751ca0a0c8ea in __srefill (fp=fp@entry=0x751ca0cb1740 <usual>) at /usr/src/lib/libc/stdio/refill.c:132
#4  0x0000751ca09f2d2d in fread (buf=buf@entry=0x7f7fffa673b0, size=size@entry=1024, count=count@entry=1, fp=fp@entry=0x751ca0cb1740 <usual>) at /usr/src/lib/libc/stdio/fread.c:128
#5  0x000000000040158b in main (argc=<optimized out>, argv=<optimized out>) at a.c:11
(gdb)

Here you can see that "/usr/obj/amd64.gcc.20260803" leaked into the binary.

Grepping /usr/lib shows a couple matches:
# grep -r /usr/obj/amd /usr/lib/libc*
Binary file /usr/lib/libc_g.a matches
Binary file /usr/lib/libc_p.a matches
Binary file /usr/lib/libcbor_g.a matches
Binary file /usr/lib/libcom_err_g.a matches
Binary file /usr/lib/libcompat_g.a matches
Binary file /usr/lib/libcrypt_g.a matches
Binary file /usr/lib/libcrypto_g.a matches
Binary file /usr/lib/libctf_g.a matches
Binary file /usr/lib/libcurses_g.a matches

I don't think it is useful to have this path and would prefer the normalized version
by default, that I hope we already get when using reproducible builds.

I tried a similar grep in an official NetBSD 10 release and see
/usr/obj/external/gpl3/gcc/lib/libgcc/libgcc
in
/usr/lib/libgcc.a
and some other files.
>How-To-Repeat:
cat > a.c << EOF
#include <err.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  FILE *fp;
  char buf[1024];
  if ((fp = fopen("a.c", "r")) == NULL) {
    err(1, "can't fopen a.c");
  }

  while (fread(buf, 1024, 1, fp) > 0) {
  }

  fclose(fp);
  return 0;
}

EOF

# cc -g  -Og -fstack-protector-all -o a a.c
# gdb a
(gdb) br read
... confirm ...
(gdb) r
(gdb) bt
>Fix:
Please make the 'reproducible build' environment the default for these paths,
or get rid of the them completely.

>Unformatted:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.