On 12/6/20 9:00 AM, Bruno Haible wrote:

The solution to this problem is to use the option '-static-libubsan'.

Unfortunately -static-libusan doesn't solve the whole problem of dynamically linking to extra libraries, and it introduces problems of its own. When I build your foo.c program on Fedora 33 x86-64:

$ gcc -O2 foo.c
$ size a.out
   text    data     bss     dec     hex filename
   1231     548      12    1791     6ff a.out
$ ldd a.out
        linux-vdso.so.1 (0x00007ffe583c8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f60a557f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f60a576e000)
$ gcc -fsanitize=undefined -fsanitize-undefined-trap-on-error -O2 foo.c
$ size a.out
   text    data     bss     dec     hex filename
   1247     548      12    1807     70f a.out
$ ldd a.out
        linux-vdso.so.1 (0x00007ffe0b100000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f79f2d98000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f79f2f87000)
$ gcc -fsanitize=undefined -static-libubsan -O2 foo.c
$ size a.out
   text    data     bss     dec     hex filename
 274576   15912  593416  883904   d7cc0 a.out
$ ldd a.out
        linux-vdso.so.1 (0x00007ffe15d15000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f0bc6af6000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f0bc6aeb000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0bc6ac9000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f0bc6983000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0bc6968000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0bc679d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0bc6b21000)
$ gcc -fsanitize=undefined -O2 foo.c
$ size a.out
   text    data     bss     dec     hex filename
   1511     660      12    2183     887 a.out
$ ldd a.out
        linux-vdso.so.1 (0x00007ffc208cd000)
        libubsan.so.1 => /lib64/libubsan.so.1 (0x00007fac5540e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fac55243000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fac5523c000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fac55231000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fac5520f000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fac55027000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fac54edf000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fac54ec4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fac55d9d000)

I tried to condense all this into something short and installed the attached into the Gnulib manual.
From d058c47204168676d6fe02b18d51916a1045149e Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Sun, 6 Dec 2020 10:03:37 -0800
Subject: [PATCH] doc: document -static-libubsan more

* doc/gnulib-readme.texi (High Quality): Document pros and cons of
-static-libubsan a bit more.  Mostly cons.
---
 ChangeLog              |  6 ++++++
 doc/gnulib-readme.texi | 16 ++++++++++++----
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 08cef4d15..14a2ea957 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2020-12-06  Paul Eggert  <egg...@cs.ucla.edu>
+
+	doc: document -static-libubsan more
+	* doc/gnulib-readme.texi (High Quality): Document pros and cons of
+	-static-libubsan a bit more.  Mostly cons.
+
 2020-12-06  Bruno Haible  <br...@clisp.org>
 
 	doc: Add more details regarding the undefined behaviour sanitizer.
diff --git a/doc/gnulib-readme.texi b/doc/gnulib-readme.texi
index cde6d7aab..833888320 100644
--- a/doc/gnulib-readme.texi
+++ b/doc/gnulib-readme.texi
@@ -559,8 +559,16 @@ the GNU C library.
 @code{-fsanitize-undefined-trap-on-error} causes @code{ubsan} to
 abort the program (through an ``illegal instruction'' signal).  This
 measure stops exploit attempts and also allows you to debug the issue.
-Without this option, @code{-fsanitize=undefined} causes messages to be
-printed, execution continues after an undefined behavior situation, and
-GCC links the program against @code{libstdc++} (which you can avoid
-through the option @code{-static-libubsan}).
 @end itemize
+
+Without the @code{-fsanitize-undefined-trap-on-error} option,
+@code{-fsanitize=undefined} causes messages to be printed, and
+execution continues after an undefined behavior situation.
+The message printing causes GCC-like compilers to arrange for the
+program to dynamically link to libraries it might not otherwise need.
+With GCC, instead of @code{-fsanitize-undefined-trap-on-error} you can
+use the @code{-static-libubsan} option to arrange for two of the extra
+libraries (@code{libstdc++} and @code{libubsan}) to be linked
+statically rather than dynamically, though this typically bloats the
+executable and the remaining extra libraries are still linked
+dynamically.
-- 
2.27.0

Reply via email to