@@ -, +, @@ [PATCH] Use -lintl when libc doesn't provide dgettext dgettext is usually provided directly by libc, but when using uClibc, the macro is expanded to libintl_dgettext, which is provided by libintl. This causes a compilation failure, so this patch fixes that by explicitly checking if the libc provides dgettext, then checking if libintl provides it and mending the linker flags if so. If not, configure will properly fail. Signed-off-by: Daniel Guzman --- configure.ac | 34 ++++++++++++++++++++++++++++++++++ libasm/Makefile.am | 1 + libdw/Makefile.am | 2 +- libelf/Makefile.am | 1 + src/Makefile.am | 30 +++++++++++++++--------------- tests/Makefile.am | 20 ++++++++++---------- 6 files changed, 62 insertions(+), 26 deletions(-) --- a/configure.ac +++ a/configure.ac @@ -326,6 +326,40 @@ else fi AC_SUBST([argp_LDADD]) +dnl Check if we have dgettext available from our libc +AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include ], + [char *test=dgettext("test","test"); return 0;] + )], + [libc_has_dgettext="true"], + [libc_has_dgettext="false"] +) + +dnl If our libc doesn't provide dgettext, then test for libintl support +if test "$libc_has_dgettext" = "false" ; then + OLD_LIBS="$LIBS" + LIBS="$OLD_LIBS -lintl" + AC_MSG_WARN("libc does not have dgettext") + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include ], + [char *test=dgettext("test","test"); return 0;] + )], + [libintl_has_dgettext="true"], + [libintl_has_dgettext="false"] + ) + if test "$libintl_has_dgettext" = "false"; then + AC_MSG_ERROR("no libintl with dgettext found") + else + intl_LDADD="-lintl" + fi + LIBS="$OLD_LIBS" +else + intl_LDADD="" +fi +AC_SUBST([intl_LDADD]) + dnl Check for __mempcpy AC_CHECK_FUNCS_ONCE([__mempcpy]) --- a/libasm/Makefile.am +++ a/libasm/Makefile.am @@ -59,6 +59,7 @@ libasm_pic_a_SOURCES = am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) libasm_so_LDLIBS = +libasm_so_LDLIBS += $(intl_LDADD) if USE_LOCKS libasm_so_LDLIBS += -lpthread endif --- a/libdw/Makefile.am +++ a/libdw/Makefile.am @@ -111,7 +111,7 @@ libdw.so: $(srcdir)/libdw.map libdw_pic.a \ -Wl,--enable-new-dtags,-rpath,$(pkglibdir) \ -Wl,--version-script,$<,--no-undefined \ -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\ - -ldl $(argp_LDADD) $(zip_LIBS) + -ldl $(argp_LDADD) $(intl_LDADD) $(zip_LIBS) if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi ln -fs $@ $@.$(VERSION) --- a/libelf/Makefile.am +++ a/libelf/Makefile.am @@ -97,6 +97,7 @@ libelf_pic_a_SOURCES = am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) libelf_so_LDLIBS = +libelf_so_LDLIBS += $(intl_LDADD) if USE_LOCKS libelf_so_LDLIBS += -lpthread endif --- a/src/Makefile.am +++ a/src/Makefile.am @@ -98,27 +98,27 @@ ldgeneric_no_Wunused = yes # Buggy old compilers. readelf_no_Werror = yes -readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl -nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl \ +readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl \ $(demanglelib) -size_LDADD = $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl -ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl +size_LDADD = $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl if NATIVE_LD # -ldl is always needed for libebl. ld_LDADD += libld_elf.a endif ld_LDFLAGS = -rdynamic -elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl -findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) -addr2line_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) -elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) -ldl -objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ldl -ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -strings_LDADD = $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) -unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) $(argp_LDADD) -ldl -stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) $(argp_LDADD) -ldl \ +elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +addr2line_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +strings_LDADD = $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl +stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl \ $(demanglelib) ldlex.o: ldscript.c --- a/tests/Makefile.am +++ a/tests/Makefile.am @@ -346,12 +346,12 @@ get_files_LDADD = $(libdw) $(libelf) $(libmudflap) get_aranges_LDADD = $(libdw) $(libelf) $(libmudflap) allfcts_LDADD = $(libdw) $(libelf) $(libmudflap) line2addr_no_Wformat = yes -line2addr_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) -addrscopes_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) -funcscopes_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) -funcretval_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) -allregs_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) -find_prologues_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) +line2addr_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +addrscopes_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +funcscopes_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +funcretval_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +allregs_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) +find_prologues_LDADD = $(libdw) $(libmudflap) $(argp_LDADD) $(intl_LDADD) #show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf) $(libmudflap) asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl @@ -362,24 +362,24 @@ asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl -dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) -ldl +dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl rdwrmmap_LDADD = $(libelf) $(libmudflap) dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl arls_LDADD = $(libelf) $(libmudflap) dwfl_bug_fd_leak_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl dwfl_bug_getmodules_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl -dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) -ldl +dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl dwarf_getmacros_LDADD = $(libdw) $(libmudflap) dwarf_getstring_LDADD = $(libdw) $(libmudflap) -addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) -ldl +addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) -ldl test_flag_nobits_LDADD = $(libelf) $(libmudflap) rerequest_tag_LDADD = $(libdw) $(libmudflap) alldts_LDADD = $(libebl) $(libelf) $(libmudflap) md5_sha1_test_LDADD = $(libeu) typeiter_LDADD = $(libdw) $(libelf) $(libmudflap) typeiter2_LDADD = $(libdw) $(libelf) $(libmudflap) -low_high_pc_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) +low_high_pc_LDADD = $(libdw) $(libelf) $(libmudflap) $(argp_LDADD) $(intl_LDADD) test_elf_cntl_gelf_getshdr_LDADD = $(libelf) $(libmudflap) dwflsyms_LDADD = $(libdw) $(libelf) $(libmudflap) dwfllines_LDADD = $(libdw) $(libelf) $(libmudflap)