Re: Capsicum and weak libc symbols
- Reply: Konstantin Belousov : "Re: Capsicum and weak libc symbols"
- In reply to: Konstantin Belousov : "Re: Capsicum and weak libc symbols"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 19 Feb 2025 09:57:57 UTC
Em sex., 7 de fev. de 2025 às 00:08, Konstantin Belousov <kostikbel@gmail.com> escreveu: > On Thu, Feb 06, 2025 at 10:40:52PM -0300, Vinícius dos Santos Oliveira wrote: > > [...] > > The purpose of the weak attribute is to allow the weak symbol to be undefined. > It is not about the order of resolution (by default our rtld indeed prefers > non-weak over weak, but it is a bug, and there is knob to turn this behavior > off). > > If you need to interpose symbol, just link the interposing object before the > object that supplies the symbol to be preempted by your definition. There are two use cases for interposing symbols: * with rtld * without rtld (fully static binaries) I don't want to change what rtld sees. I don't want to change /lib/libc.so.7. It works fines as is right now. I want to change what /usr/bin/ld.lld sees. I only want the symbols to be weak in /usr/lib/libc.a. For instance, the following code fails to compile when you try to build a static binary (it works fine on the default mode though): #include <dirent.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> DIR *opendir(const char *name) { if (name[0] == '\0') { errno = ENOENT; return NULL; } int fd = open(name, O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC); if (fd == -1) { return NULL; } DIR *ret = fdopendir(fd); if (!ret) { int saved_errno = errno; close(fd); errno = saved_errno; } return ret; } int main(int argc, char *argv[]) { (void)argc; (void)argv; } The build output for for clang -static will be: ld: error: duplicate symbol: opendir >>> defined at t2.c >>> /tmp/t2-3cf81c.o:(opendir) >>> defined at opendir.c:55 (/usr/src/lib/libc/gen/opendir.c:55) >>> opendir.o:(.text+0x0) in archive /usr/lib/libc.a clang: error: linker command failed with exit code 1 (use -v to see invocation) Meanwhile symbols such as unlink are weak (in /usr/lib/libc.a) and I can interpose them easily in static builds as well. However with further investigation I've realised that weak symbols in /usr/lib/libc.a are also weak in /lib/libc.so.7. Does FreeBSD use the same weak attributes whether it's building libc.so.7 or libc.a? -- Vinícius dos Santos Oliveira https://vinipsmaker.github.io/