[Bug,libdw/30077] Duplicate definition of typedef struct debuginfod_client in libdwfl

Message ID bug-30077-10460-nw40Xs8TiP@http.sourceware.org/bugzilla/
State Committed
Headers
Series [Bug,libdw/30077] Duplicate definition of typedef struct debuginfod_client in libdwfl |

Commit Message

fche at redhat dot com Feb. 4, 2023, 5:32 p.m. UTC
  https://sourceware.org/bugzilla/show_bug.cgi?id=30077

Mark Wielaard <mark at klomp dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mark at klomp dot org

--- Comment #1 from Mark Wielaard <mark at klomp dot org> ---
(In reply to David Edelsohn from comment #0)
> typedef struct debuginfod_client is defined in both libdwfl/libdwfl.h and in
> debuginfod.h included by libdwfl/libdwflP.h.  Although innocuous, this is
> invalid C and causes compilation failures with strict compliance.

Is there a gcc flag that can help us detect this issue?

If the problem is that there cannot be two equal typedefs then we have to solve
this not just in the implementation code but also in the public headers.

If if understand the issue correctly then a program that includes both the
public debuginfod.h and dwfl.h headers (in any order or indirectly) has the
same problem?

Would the following fix it?
  

Patch

diff --git a/debuginfod/debuginfod.h.in b/debuginfod/debuginfod.h.in
index 69c9efd2..4a256ba9 100644
--- a/debuginfod/debuginfod.h.in
+++ b/debuginfod/debuginfod.h.in
@@ -44,7 +44,10 @@ 
 #define DEBUGINFOD_SONAME "@LIBDEBUGINFOD_SONAME@"

 /* Handle for debuginfod-client connection.  */
+#ifndef _ELFUTILS_DEBUGINFOD_CLIENT_TYPEDEF
 typedef struct debuginfod_client debuginfod_client;
+#define _ELFUTILS_DEBUGINFOD_CLIENT_TYPEDEF 1
+#endif

 #ifdef __cplusplus
 extern "C" {
diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h
index 9114f7f0..49ad6664 100644
--- a/libdwfl/libdwfl.h
+++ b/libdwfl/libdwfl.h
@@ -50,7 +50,10 @@  typedef struct Dwfl_Thread Dwfl_Thread;
 typedef struct Dwfl_Frame Dwfl_Frame;

 /* Handle for debuginfod-client connection.  */
+#ifndef _ELFUTILS_DEBUGINFOD_CLIENT_TYPEDEF
 typedef struct debuginfod_client debuginfod_client;
+#define _ELFUTILS_DEBUGINFOD_CLIENT_TYPEDEF 1
+#endif

 /* Callbacks.  */
 typedef struct