Bug 30987 - Addition of strlcopy and strlcat to glibc prevents compilation of dyninst based systemtap instrumentation
Summary: Addition of strlcopy and strlcat to glibc prevents compilation of dyninst bas...
Status: RESOLVED FIXED
Alias: None
Product: systemtap
Classification: Unclassified
Component: runtime (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Unassigned
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-10-20 14:42 UTC by William Cohen
Modified: 2023-10-25 16:00 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description William Cohen 2023-10-20 14:42:45 UTC
On Fedora rawhide the systemtap "make installcheck" tests building instrumentation using dyninst fail to compile because glibc has added strlcpy and strlcat to the /usr/include/string.h file and those declarations conflict with the static inlined functioned in runtime/dynsint/linux_defs.h.  This is causing over 400 failures on rawhide for the "make installcheck".  Can replicate with:

 sudo make installcheck RUNTESTFLAGS="systemtap.base/ret-uprobe-var.exp"


And see following in the output:

FAIL: ret-uprobe-var: TEST 1: @var in return probes should not be stale (4.1+) (dyninst): stderr: string should be "", but got "In file included from /home/wcohen/systemtap_write/install/share/systemtap/runtime/dyninst/runtime.h:92,
                 from /home/wcohen/systemtap_write/install/share/systemtap/runtime/runtime.h:30,
                 from /tmp/stapDni8D1/stap_e18df6414ee02f320dd0e235e95dc3d9_2203_src.c:21:
/home/wcohen/systemtap_write/install/share/systemtap/runtime/dyninst/linux_defs.h:100:22: error: static declaration of 'strlcpy' follows non-static declaration
  100 | static inline size_t strlcpy(char *__restrict dest, const char *__restrict src, size_t size)
      |                      ^~~~~~~
In file included from /home/wcohen/systemtap_write/install/share/systemtap/runtime/dyninst/runtime.h:22:
/usr/include/string.h:506:15: note: previous declaration of 'strlcpy' with type 'size_t(char * restrict,  const char * restrict,  size_t)' {aka 'long unsigned int(char * restrict,  const char * restrict,  long unsigned int)'}
  506 | extern size_t strlcpy (char *__restrict __dest,
      |               ^~~~~~~
/home/wcohen/systemtap_write/install/share/systemtap/runtime/dyninst/linux_defs.h:112:22: error: static declaration of 'strlcat' follows non-static declaration
  112 | static inline size_t strlcat(char *__restrict dest, const char *__restrict src, size_t count)
      |                      ^~~~~~~
/usr/include/string.h:512:15: note: previous declaration of 'strlcat' with type 'size_t(char * restrict,  const char * restrict,  size_t)' {aka 'long unsigned int(char * restrict,  const char * restrict,  long unsigned int)'}
  512 | extern size_t strlcat (char *__restrict __dest,
      |               ^~~~~~~
WARNING: gcc exited with status: 1
Pass 4: compilation failed.  [man error::pass4]
"
Comment 1 William Cohen 2023-10-24 18:15:09 UTC
Was originally thinking that could do a STAPCONF* define as for various kernel changes.  However, for the dyninst backend those autoconf tests are not run and use the define to control whether the strlcat and strlcpy inline functions are provided.

As strlcat and strlcpy are inlined functions can't really make the inline function and the glibc string.h declarations line up.
Comment 2 William Cohen 2023-10-25 16:00:26 UTC
This is fixed by commit b94816005cf7bb78b14f916d3ba246a623b9560c 
Author: William Cohen <wcohen@redhat.com>
Date:   Wed Oct 25 11:51:17 2023 -0400

    PR30987: Exclude strlcpy and strlcat for glibc 2.38 and newer
    
    The glibc library added strlcpy and strlcat.  The inlined functions in
    runtime/dyninst/linux_defs.h conflicted with the glibc declarations of
    those functions in /usr/include/string.h.  Now linux_defs.h only
    defines those functions for older version of glibc that do not include
    them.