diff options
author | Kelvin M. Klann <kmk3.code@protonmail.com> | 2021-06-15 16:17:56 -0300 |
---|---|---|
committer | Kelvin M. Klann <kmk3.code@protonmail.com> | 2021-06-25 17:00:35 -0300 |
commit | b408b20c70816ed16ed6343e36af3f9d26976752 (patch) | |
tree | de10b7793095605b3ee2ee6deae65e273c76d9e7 /src | |
parent | gcov: add missing gcov.h includes (diff) | |
download | firejail-b408b20c70816ed16ed6343e36af3f9d26976752.tar.gz firejail-b408b20c70816ed16ed6343e36af3f9d26976752.tar.zst firejail-b408b20c70816ed16ed6343e36af3f9d26976752.zip |
gcov: fix build failure with gcc 11.1.0
The build currently fails if gcov support is enabled:
$ pacman -Q gcc
gcc 11.1.0-1
$ ./configure --prefix=/usr --enable-apparmor --enable-gcov >/dev/null
$ make >/dev/null
[...]
netstats.c: In function ‘netstats’:
netstats.c:250:25: warning: implicit declaration of function ‘__gcov_flush’; did you mean ‘__gcov_dump’? [-Wimplicit-function-declaration]
250 | __gcov_flush();
| ^~~~~~~~~~~~
| __gcov_dump
[...]
/usr/bin/ld: netstats.o: in function `netstats':
/tmp/firejail-git/src/firejail-git/src/firemon/netstats.c:250: undefined reference to `__gcov_flush'
[...]
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:10: firemon] Error 1
make: *** [Makefile:42: src/firemon/firemon] Error 2
[...]
This happens because __gcov_flush was removed on gcc 11.1.0[1] [2] [3].
See the following gcc commits:
* d39f7dc8d5 ("Do locking for __gcov_dump and __gcov_reset as well.")
* c0532db47d ("Use __gcov_dump and __gcov_reset in execv and fork context.")
* 811b7636cb ("Remove __gcov_flush.")
Its implementation did the following[4]:
__gcov_lock ();
__gcov_dump_int ();
__gcov_reset_int ();
__gcov_unlock ();
As hinted in the commit messages above, the function is no longer needed
because locking is now done inside each of __gcov_dump and __gcov_reset.
So add an implementation of __gcov_flush (on a new gcov_wrapper.h file)
for gcc >= 11.1.0, which just calls __gcov_dump and then __gcov_reset.
Commands used to search and replace:
$ git grep -Flz '#include <gcov.h>' -- '*.c' |
xargs -0 -I '{}' sh -c \
"printf '%s\n' \"\`sed 's|<gcov\\.h>|\"../include/gcov_wrapper.h\"|' '{}'\`\" >'{}'"
Note: This is the continuation of commit 31557e9c7 ("gcov: add missing
gcov.h includes") / PR #4360.
[1] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d39f7dc8d558ca31a661b02d08ff090ce65e6652
[2] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=c0532db47d092430f8e8f497b2dc53343527bb13
[3] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=811b7636cb8c10f1a550a76242b5666c7ae36da2
[4] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/libgcov-interface.c;h=855e8612018d1c9caf90396a3271337aaefdb9b3#l86
Diffstat (limited to 'src')
-rw-r--r-- | src/firejail/appimage.c | 2 | ||||
-rw-r--r-- | src/firejail/chroot.c | 2 | ||||
-rw-r--r-- | src/firejail/fs.c | 2 | ||||
-rw-r--r-- | src/firejail/fs_mkdir.c | 2 | ||||
-rw-r--r-- | src/firejail/ls.c | 2 | ||||
-rw-r--r-- | src/firejail/main.c | 2 | ||||
-rw-r--r-- | src/firejail/profile.c | 2 | ||||
-rw-r--r-- | src/firejail/rlimit.c | 2 | ||||
-rw-r--r-- | src/firejail/sandbox.c | 2 | ||||
-rw-r--r-- | src/firejail/util.c | 2 | ||||
-rw-r--r-- | src/firemon/interface.c | 2 | ||||
-rw-r--r-- | src/firemon/netstats.c | 2 | ||||
-rw-r--r-- | src/firemon/procevent.c | 2 | ||||
-rw-r--r-- | src/firemon/top.c | 2 | ||||
-rw-r--r-- | src/include/gcov_wrapper.h | 40 |
15 files changed, 54 insertions, 14 deletions
diff --git a/src/firejail/appimage.c b/src/firejail/appimage.c index 17e59d2ef..e019de36f 100644 --- a/src/firejail/appimage.c +++ b/src/firejail/appimage.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <errno.h> | 29 | #include <errno.h> |
30 | 30 | ||
31 | #ifdef HAVE_GCOV | 31 | #ifdef HAVE_GCOV |
32 | #include <gcov.h> | 32 | #include "../include/gcov_wrapper.h" |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | static char *devloop = NULL; // device file | 35 | static char *devloop = NULL; // device file |
diff --git a/src/firejail/chroot.c b/src/firejail/chroot.c index edc31cdea..0d4baa618 100644 --- a/src/firejail/chroot.c +++ b/src/firejail/chroot.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #ifdef HAVE_GCOV | 32 | #ifdef HAVE_GCOV |
33 | #include <gcov.h> | 33 | #include "../include/gcov_wrapper.h" |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | // exit if error | 36 | // exit if error |
diff --git a/src/firejail/fs.c b/src/firejail/fs.c index e57038ee0..803b081c9 100644 --- a/src/firejail/fs.c +++ b/src/firejail/fs.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #ifdef HAVE_GCOV | 36 | #ifdef HAVE_GCOV |
37 | #include <gcov.h> | 37 | #include "../include/gcov_wrapper.h" |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #define MAX_BUF 4096 | 40 | #define MAX_BUF 4096 |
diff --git a/src/firejail/fs_mkdir.c b/src/firejail/fs_mkdir.c index bbc2aa938..0195435f9 100644 --- a/src/firejail/fs_mkdir.c +++ b/src/firejail/fs_mkdir.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <string.h> | 26 | #include <string.h> |
27 | 27 | ||
28 | #ifdef HAVE_GCOV | 28 | #ifdef HAVE_GCOV |
29 | #include <gcov.h> | 29 | #include "../include/gcov_wrapper.h" |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | static void check(const char *fname) { | 32 | static void check(const char *fname) { |
diff --git a/src/firejail/ls.c b/src/firejail/ls.c index 6ee557648..ae7e89741 100644 --- a/src/firejail/ls.c +++ b/src/firejail/ls.c | |||
@@ -32,7 +32,7 @@ | |||
32 | //#include <stdlib.h> | 32 | //#include <stdlib.h> |
33 | 33 | ||
34 | #ifdef HAVE_GCOV | 34 | #ifdef HAVE_GCOV |
35 | #include <gcov.h> | 35 | #include "../include/gcov_wrapper.h" |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | // uid/gid cache | 38 | // uid/gid cache |
diff --git a/src/firejail/main.c b/src/firejail/main.c index 02366a08c..86c6575e2 100644 --- a/src/firejail/main.c +++ b/src/firejail/main.c | |||
@@ -45,7 +45,7 @@ | |||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifdef HAVE_GCOV | 47 | #ifdef HAVE_GCOV |
48 | #include <gcov.h> | 48 | #include "../include/gcov_wrapper.h" |
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | #ifdef __ia64__ | 51 | #ifdef __ia64__ |
diff --git a/src/firejail/profile.c b/src/firejail/profile.c index 807a77bd7..8675a1712 100644 --- a/src/firejail/profile.c +++ b/src/firejail/profile.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <sys/stat.h> | 24 | #include <sys/stat.h> |
25 | 25 | ||
26 | #ifdef HAVE_GCOV | 26 | #ifdef HAVE_GCOV |
27 | #include <gcov.h> | 27 | #include "../include/gcov_wrapper.h" |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | extern char *xephyr_screen; | 30 | extern char *xephyr_screen; |
diff --git a/src/firejail/rlimit.c b/src/firejail/rlimit.c index dd6fec972..2666486fa 100644 --- a/src/firejail/rlimit.c +++ b/src/firejail/rlimit.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <sys/resource.h> | 22 | #include <sys/resource.h> |
23 | 23 | ||
24 | #ifdef HAVE_GCOV | 24 | #ifdef HAVE_GCOV |
25 | #include <gcov.h> | 25 | #include "../include/gcov_wrapper.h" |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | void set_rlimits(void) { | 28 | void set_rlimits(void) { |
diff --git a/src/firejail/sandbox.c b/src/firejail/sandbox.c index e06ba3617..7bf372a14 100644 --- a/src/firejail/sandbox.c +++ b/src/firejail/sandbox.c | |||
@@ -50,7 +50,7 @@ | |||
50 | #endif | 50 | #endif |
51 | 51 | ||
52 | #ifdef HAVE_GCOV | 52 | #ifdef HAVE_GCOV |
53 | #include <gcov.h> | 53 | #include "../include/gcov_wrapper.h" |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | static int force_nonewprivs = 0; | 56 | static int force_nonewprivs = 0; |
diff --git a/src/firejail/util.c b/src/firejail/util.c index 47c367aad..71dd84e8f 100644 --- a/src/firejail/util.c +++ b/src/firejail/util.c | |||
@@ -42,7 +42,7 @@ | |||
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #ifdef HAVE_GCOV | 44 | #ifdef HAVE_GCOV |
45 | #include <gcov.h> | 45 | #include "../include/gcov_wrapper.h" |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | #define MAX_GROUPS 1024 | 48 | #define MAX_GROUPS 1024 |
diff --git a/src/firemon/interface.c b/src/firemon/interface.c index b93d4a5a2..372cdee41 100644 --- a/src/firemon/interface.c +++ b/src/firemon/interface.c | |||
@@ -34,7 +34,7 @@ | |||
34 | //#include <linux/if_bridge.h> | 34 | //#include <linux/if_bridge.h> |
35 | 35 | ||
36 | #ifdef HAVE_GCOV | 36 | #ifdef HAVE_GCOV |
37 | #include <gcov.h> | 37 | #include "../include/gcov_wrapper.h" |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | // print IP addresses for all interfaces | 40 | // print IP addresses for all interfaces |
diff --git a/src/firemon/netstats.c b/src/firemon/netstats.c index 23d228e26..bc951aa26 100644 --- a/src/firemon/netstats.c +++ b/src/firemon/netstats.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <unistd.h> | 25 | #include <unistd.h> |
26 | 26 | ||
27 | #ifdef HAVE_GCOV | 27 | #ifdef HAVE_GCOV |
28 | #include <gcov.h> | 28 | #include "../include/gcov_wrapper.h" |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #define MAXBUF 4096 | 31 | #define MAXBUF 4096 |
diff --git a/src/firemon/procevent.c b/src/firemon/procevent.c index 4e809681e..79f487582 100644 --- a/src/firemon/procevent.c +++ b/src/firemon/procevent.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <sys/uio.h> | 31 | #include <sys/uio.h> |
32 | 32 | ||
33 | #ifdef HAVE_GCOV | 33 | #ifdef HAVE_GCOV |
34 | #include <gcov.h> | 34 | #include "../include/gcov_wrapper.h" |
35 | #endif | 35 | #endif |
36 | 36 | ||
37 | #define PIDS_BUFLEN 4096 | 37 | #define PIDS_BUFLEN 4096 |
diff --git a/src/firemon/top.c b/src/firemon/top.c index 9d6f34991..d0f911e60 100644 --- a/src/firemon/top.c +++ b/src/firemon/top.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <unistd.h> | 25 | #include <unistd.h> |
26 | 26 | ||
27 | #ifdef HAVE_GCOV | 27 | #ifdef HAVE_GCOV |
28 | #include <gcov.h> | 28 | #include "../include/gcov_wrapper.h" |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | static unsigned pgs_rss = 0; | 31 | static unsigned pgs_rss = 0; |
diff --git a/src/include/gcov_wrapper.h b/src/include/gcov_wrapper.h new file mode 100644 index 000000000..2f409309d --- /dev/null +++ b/src/include/gcov_wrapper.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2021 Firejail Authors | ||
3 | * | ||
4 | * This file is part of firejail project | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef GCOV_WRAPPER_H | ||
22 | #define GCOV_WRAPPER_H | ||
23 | |||
24 | #include <gcov.h> | ||
25 | |||
26 | /* | ||
27 | * __gcov_flush was removed on gcc 11.1.0 (as it's no longer needed), but it | ||
28 | * appears to be the safe/"correct" way to do things on previous versions (as | ||
29 | * it ensured proper locking, which is now done elsewhere). Thus, keep using | ||
30 | * it in the code and ensure that it exists, in order to support gcc <11.1.0 | ||
31 | * and gcc >=11.1.0, respectively. | ||
32 | */ | ||
33 | #if __GNUC__ > 11 || (__GNUC__ == 11 && __GNUC_MINOR__ >= 1) | ||
34 | static void __gcov_flush(void) { | ||
35 | __gcov_dump(); | ||
36 | __gcov_reset(); | ||
37 | } | ||
38 | #endif | ||
39 | |||
40 | #endif /* GCOV_WRAPPER_H */ | ||