#1149626 nethogs: FTBFS with GCC 15 due to missing compiler-generated symbols

Package:
src:nethogs
Source:
src:nethogs
Submitter:
Viktor Pashaiev
Date:
2026-10-01 17:15:02 UTC
Severity:
normal
Tags:
#1149626#5
Date:
2026-10-01 17:13:04 UTC
From:
To:
Dear Maintainer,

nethogs 0.9.0-1 fails to build from source under GCC 15 because dpkg-gensymbols
detects missing symbols in debian/libnethogs0.symbols:

  dpkg-gensymbols: error: some symbols or patterns disappeared in the symbols file

GCC 15 optimizes and inlines compiler-generated C++ template instantiations,
destructors (std::map, std::vector, std::list, std::_Rb_tree, std::ctype),
and PackListNode::~PackListNode(), omitting them from dynamic export.

None of these internal C++ symbols belong to the public libnethogs0 C ABI
(nethogsmonitor_loop, nethogsmonitor_breakloop, nethogs_packet_stats,
nethogs_enable_udp).

Marking these symbols as (optional) in debian/libnethogs0.symbols allows the
package to build cleanly under GCC 15 while keeping tracking for architectures
or compilers where they remain emitted.

This issue and fix were tracked in Ubuntu:
https://bugs.launchpad.net/ubuntu/+source/nethogs/+bug/2168992

The attached patch resolves the build failure.
--- a/debian/libnethogs0.symbols
+++ b/debian/libnethogs0.symbols
@@ -7,7 +7,7 @@
  (c++)"process_ip(unsigned char*, pcap_pkthdr const*, unsigned char const*)@Base" 0.8.8
  (c++)"sameinaddr(in_addr, in_addr)@Base" 0.8.8
  (c++)"up_running(int)@Base" 0.8.8
- (c++)"addprocinfo(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >&)@Base" 0.8.8
+ (c++|optional)"addprocinfo(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >&)@Base" 0.8.8
  (c++)"findProcess(prg_node*)@Base" 0.8.8
  (c++)"findProcess(unsigned long)@Base" 0.8.8
  (c++)"get_devices(int, char**, bool)@Base" 0.8.8
@@ -19,7 +19,7 @@
  (c++)"process_init()@Base" 0.8.8
  (c++)"conninode_tcp[abi:cxx11]@Base" 0.8.8
  (c++)"conninode_udp[abi:cxx11]@Base" 0.8.8
- (c++)"addtoconninode(char*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >&)@Base" 0.8.8
+ (c++|optional)"addtoconninode(char*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >&)@Base" 0.8.8
  (c++)"findConnection(Packet*, short)@Base" 0.8.8
  (c++)"reread_mapping()@Base" 0.8.8
  (c++)"check_all_procs()@Base" 0.8.8
@@ -59,7 +59,7 @@
  (c++)"Connection::~Connection()@Base" 0.8.8
  (c++)"local_addr::contains(in6_addr const&)@Base" 0.8.8
  (c++)"local_addr::contains(unsigned int const&)@Base" 0.8.8
- (c++)"PackListNode::~PackListNode()@Base" 0.8.8
+ (c++|optional)"PackListNode::~PackListNode()@Base" 0.8.8
  (c++)"Packet::isOlderThan(timeval)@Base" 0.8.8
  (c++)"Packet::newInverted()@Base" 0.8.8
  (c++)"Packet::gethashstring()@Base" 0.8.8
@@ -85,23 +85,23 @@
  (c++)"Packet::matchSource(Packet const*) const@Base" 0.8.8
  (c++)"Packet::match(Packet const*) const@Base" 0.8.8
  (c++)"Packet::operator<(Packet const&) const@Base" 0.8.8
- (c++)"std::ctype<char>::do_widen(char) const@Base" 0.8.8
- (c++)"std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::~map()@Base" 0.8.8
- (c++)"std::map<void*, NethogsMonitorRecord, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::~map()@Base" 0.8.8
- (c++)"std::map<unsigned long, prg_node*, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, prg_node*> > >::~map()@Base" 0.8.8
- (c++)"std::set<int, std::less<int>, std::allocator<int> >::~set()@Base" 0.8.8
- (c++)"std::vector<int, std::allocator<int> >::~vector()@Base" 0.8.8
- (c++)"std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf()@Base" 0.8.8
- (c++)"std::__cxx11::list<handle, std::allocator<handle> >::~list()@Base" 0.8.8
- (c++|arch=!m68k)"std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>&&, std::tuple<>&&)@Base" 0.8.8
- (c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_get_insert_unique_pos(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.8
- (c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.8
- (c++|arch=!armel,!armhf,!i386,!s390x,!alpha,!powerpc,!ppc64)"std::_Rb_tree<Connection*, Connection*, std::_Identity<Connection*>, ConnectionComparator, std::allocator<Connection*> >::equal_range(Connection* const&)@Base" 0.8.8
- (c++|arch=amd64,arm64,ppc64el)"std::pair<std::_Rb_tree_iterator<int>, bool> std::_Rb_tree<int, int, std::_Identity<int>, std::less<int>, std::allocator<int> >::_M_insert_unique<int>(int&&)@Base" 0.8.8
- (c++|arch=mips64el,riscv64,loong64)"std::_Rb_tree<void*, std::pair<void* const, NethogsMonitorRecord>, std::_Select1st<std::pair<void* const, NethogsMonitorRecord> >, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::_M_get_insert_unique_pos(void* const&)@Base" 0.8.8
- (c++|arch=mips64el,riscv64,loong64)"std::_Rb_tree<void*, std::pair<void* const, NethogsMonitorRecord>, std::_Select1st<std::pair<void* const, NethogsMonitorRecord> >, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<void* const, NethogsMonitorRecord> >, void* const&)@Base" 0.8.8
- (c++)"std::multiset<Connection*, ConnectionComparator, std::allocator<Connection*> >::~multiset()@Base" 0.8.8
- (c++|arch=!m68k)"std::piecewise_construct@Base" 0.8.8
+ (c++|optional)"std::ctype<char>::do_widen(char) const@Base" 0.8.8
+ (c++|optional)"std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::~map()@Base" 0.8.8
+ (c++|optional)"std::map<void*, NethogsMonitorRecord, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::~map()@Base" 0.8.8
+ (c++|optional)"std::map<unsigned long, prg_node*, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, prg_node*> > >::~map()@Base" 0.8.8
+ (c++|optional)"std::set<int, std::less<int>, std::allocator<int> >::~set()@Base" 0.8.8
+ (c++|optional)"std::vector<int, std::allocator<int> >::~vector()@Base" 0.8.8
+ (c++|optional)"std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf()@Base" 0.8.8
+ (c++|optional)"std::__cxx11::list<handle, std::allocator<handle> >::~list()@Base" 0.8.8
+ (c++|optional|arch=!m68k)"std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>&&, std::tuple<>&&)@Base" 0.8.8
+ (c++|optional)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_get_insert_unique_pos(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.8
+ (c++|optional)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.8
+ (c++|optional|arch=!armel,!armhf,!i386,!s390x,!alpha,!powerpc,!ppc64)"std::_Rb_tree<Connection*, Connection*, std::_Identity<Connection*>, ConnectionComparator, std::allocator<Connection*> >::equal_range(Connection* const&)@Base" 0.8.8
+ (c++|optional|arch=amd64,arm64,ppc64el)"std::pair<std::_Rb_tree_iterator<int>, bool> std::_Rb_tree<int, int, std::_Identity<int>, std::less<int>, std::allocator<int> >::_M_insert_unique<int>(int&&)@Base" 0.8.8
+ (c++|optional|arch=mips64el,riscv64,loong64)"std::_Rb_tree<void*, std::pair<void* const, NethogsMonitorRecord>, std::_Select1st<std::pair<void* const, NethogsMonitorRecord> >, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::_M_get_insert_unique_pos(void* const&)@Base" 0.8.8
+ (c++|optional|arch=mips64el,riscv64,loong64)"std::_Rb_tree<void*, std::pair<void* const, NethogsMonitorRecord>, std::_Select1st<std::pair<void* const, NethogsMonitorRecord> >, std::less<void*>, std::allocator<std::pair<void* const, NethogsMonitorRecord> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<void* const, NethogsMonitorRecord> >, void* const&)@Base" 0.8.8
+ (c++|optional)"std::multiset<Connection*, ConnectionComparator, std::allocator<Connection*> >::~multiset()@Base" 0.8.8
+ (c++|optional|arch=!m68k)"std::piecewise_construct@Base" 0.8.8