tst_libext2fs: Avoid multiple definition of global variables
PATCH 1/1 tst_libext2fs: Avoid multiple definition of global variables
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs unit tests fail because tst_libext2fs.c end up with a build error.
This is because it defines two global variables debug_prog_name and extra_cmds that are already defined in debugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.
Fix the problem by creating an extern declaration of said variables in debugfs.h and just setting them in tst_libext2fs.c without additional declaration.
--- debugfs/debugfs.h | 2 ++ lib/ext2fs/tst_libext2fs.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-)
debugfs/debugfs.h +2 -0
@@ -123,6 +123,8 @@ extern void do_set_block_group_descriptor(int argc, char **, int sci_idx, void *extern void do_dump_unused (int argc,char **argv,int sci_idx,void *infop);/* debugfs.c */ +extern ss_request_table *extra_cmds; +extern const char *debug_prog_name;extern void internal_dump_inode (FILE *,const char *,ext2_ino_t ,struct ext2_inode *,int );
lib/ext2fs/tst_libext2fs.c +3 -2
@@ -28,9 +28,7 @@* Hook in new commands into debugfs * Override debugfs's prompt */ -const char *debug_prog_name ="tst_libext2fs" ;extern ss_request_table libext2fs_cmds; -ss_request_table *extra_cmds = &libext2fs_cmds; static int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t *blocknr, e2_blkcnt_t blockcnt,
@@ -51,6 +49,9 @@ void do_block_iterate(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),int err =0 ;int flags =0 ; + debug_prog_name ="tst_libext2fs" ; + extra_cmds = &libext2fs_cmds; +if (common_args_process (argc, argv,2 ,3 , argv[0 ], usage,0 ))return ;
Signature · 1 line
2.21.1
Quoted 10 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs unit tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.
Quoted 5 lines
Fix the problem by creating an extern declaration of said variables in
debugfs.hand just setting them intst_libext2fs.cwithout additional declaration.Signed-off-by Lukas Czerner <[email protected]>
This looks fine to me.
Is there any need to fix the one in lib/ext2fs/extent.c ? It's only there under #ifdef DEBUG though.
Thanks,
-Eric
Quoted 15 lines · Eric Sandeen
Quoted 14 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs unit tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.Fix the problem by creating an extern declaration of said variables in
debugfs.hand just setting them intst_libext2fs.cwithout additional declaration.
Quoted 8 lines
Quoted 1 line
Signed-off-by Lukas Czerner <[email protected]>This looks fine to me.
Reviewed-by Eric Sandeen <[email protected]>Is there any need to fix the one in
lib/ext2fs/extent.c? It's only there under #ifdef DEBUG though.
Yeah, but if we ever want to use DEBUG macro it would fail with -fno-common. Uff, I guess I have to fix this one as well.
Thanks Eric,
-Lukas
Quoted 4 lines
Thanks,
-Eric
PATCH v2 1/1 tst_libext2fs: Avoid multiple definition of global variables
In reply to Lukas Czernergcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs make check tests fail because tst_libext2fs.c end up with a build error.
This is because it defines two global variables debug_prog_name and extra_cmds that are already defined in debugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.
Fix the problem by using SKIP_GLOBDEFS macro to skip the variables definition in debugfs.c. Note that debug_prog_name is also defined in lib/ext2fs/extent.c when DEBUG macro is used, but this does not work even with older gcc versions and is never used regardless so I am not going to bother with it.
---
v2: Previous fix wasn't really working properly
debugfs/debugfs.c | 6 ++++++ debugfs/debugfs.h | 2 ++ lib/ext2fs/Makefile.in | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-)
debugfs/debugfs.c +6 -0
@@ -48,8 +48,14 @@ extern char *optarg;int journal_enable_debug =-1 ;#endif +/* +* There must be only one definition if we're hooking in extra commands or +* chaging default prompt. Use -DSKIP_GLOBDEF for that. +*/ +#ifndef SKIP_GLOBDEFS ss_request_table *extra_cmds;const char *debug_prog_name; +#endif int ss_sci_idx;ext2_filsys current_fs;
debugfs/debugfs.h +2 -0
@@ -123,6 +123,8 @@ extern void do_set_block_group_descriptor(int argc, char **, int sci_idx, void *extern void do_dump_unused (int argc,char **argv,int sci_idx,void *infop);/* debugfs.c */ +extern ss_request_table *extra_cmds; +extern const char *debug_prog_name;extern void internal_dump_inode (FILE *,const char *,ext2_ino_t ,struct ext2_inode *,int );
lib/ext2fs/Makefile.in +1 -1
@@ -377,7 +377,7 @@ extent_cmds.c extent_cmds.h: $(top_srcdir)/debugfs/extent_cmds.ct debugfs.o: $(top_srcdir)/debugfs/debugfs.c $(E) " CC $<" - $(Q) $(CC) $(DEBUGFS_CFLAGS) -c $< -o $@ + $(Q) $(CC) $(DEBUGFS_CFLAGS) -DSKIP_GLOBDEFS -c $< -o $@ extent_inode.o: $(top_srcdir)/debugfs/extent_inode.c $(E) " CC $<"
Signature · 1 line
2.21.1
Quoted 16 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs make check tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.Fix the problem by using
SKIP_GLOBDEFSmacro to skip the variables definition indebugfs.c. Note thatdebug_prog_nameis also defined inlib/ext2fs/extent.cwhen DEBUG macro is used, but this does not work even with older gcc versions and is never used regardless so I am not going to bother with it.
Quoted 3 lines
Signed-off-by Lukas Czerner <[email protected]>---
v2: Previous fix wasn't really working properly
What was not working properly?
It seemed reasonable to me. The new mechanism looks like it would work, but the first patch seemed more obvious, so I'd like to know what the problem was.
Thanks,
-Eric
Quoted 21 lines · Eric Sandeen
Quoted 16 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs make check tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.Fix the problem by using
SKIP_GLOBDEFSmacro to skip the variables definition indebugfs.c. Note thatdebug_prog_nameis also defined inlib/ext2fs/extent.cwhen DEBUG macro is used, but this does not work even with older gcc versions and is never used regardless so I am not going to bother with it.Quoted 3 lines
Signed-off-by Lukas Czerner <[email protected]>---
v2: Previous fix wasn't really working properly
Quoted 5 lines
What was not working properly?
It seemed reasonable to me. The new mechanism looks like it would work, but the first patch seemed more obvious, so I'd like to know what the problem was.
I built e2fsprogs & ran make check from git on Fedora Rawhide w/ your first patch, and it all seemed to work fine so I'll just stand by for more info. :)
-Eric
Quoted 16 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs make check tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.Fix the problem by using
SKIP_GLOBDEFSmacro to skip the variables definition indebugfs.c. Note thatdebug_prog_nameis also defined inlib/ext2fs/extent.cwhen DEBUG macro is used, but this does not work even with older gcc versions and is never used regardless so I am not going to bother with it.
Quoted 3 lines
Signed-off-by Lukas Czerner <[email protected]>---
v2: Previous fix wasn't really working properly
Lukas explained the problem to me - wow the test binaries are tricky. ;)
Theodore Y. Ts'o
AppliedQuoted 10 lines · Lukas Czerner
gcc version 10 changed the default from -fcommon to -fno-common and as a result e2fsprogs make check tests fail because
tst_libext2fs.cend up with a build error.This is because it defines two global variables
debug_prog_nameandextra_cmdsthat are already defined indebugfs/debugfs.c. With -fcommon linker was able to resolve those into the same object, however with -fno-common it's no longer able to do it and we end up with multiple definition errors.
Quoted 7 lines
Fix the problem by using
SKIP_GLOBDEFSmacro to skip the variables definition indebugfs.c. Note thatdebug_prog_nameis also defined inlib/ext2fs/extent.cwhen DEBUG macro is used, but this does not work even with older gcc versions and is never used regardless so I am not going to bother with it.Signed-off-by Lukas Czerner <[email protected]>
Applied, thanks.
- Ted