Skip to content

Commit

Permalink
Add an autoconf test to test whether the .section .gnu<warning>
Browse files Browse the repository at this point in the history
works with the linker on the system, and define _warn_references
to nothing if not.
  • Loading branch information
lastquestion committed Sep 10, 2012
1 parent 4b1a066 commit e7e0600
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 8 deletions.
6 changes: 3 additions & 3 deletions config.h.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
/* config.h.in. Generated from configure.in by autoheader. */

/* Define if .gnu.warning accepts long strings. */
#undef HAS_GNU_WARNING_LONG

/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H

Expand Down Expand Up @@ -114,9 +117,6 @@
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME

/* Define to the home page for this package. */
#undef PACKAGE_URL

/* Define to the version of this package. */
#undef PACKAGE_VERSION

Expand Down
18 changes: 18 additions & 0 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,24 @@ AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS(strcasecmp strdup strndup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp)

#check if .section.gnu.warning accepts long strings (for __warn_references)
AC_LANG_PUSH([C])

AC_MSG_CHECKING([if .gnu.warning accepts long strings])
AC_LINK_IFELSE([[
extern void json_object_get();
__asm__(".section .gnu.json_object_get,\n\t.ascii \"Please link against libjson-c instead of libjson\"\n\t.text");

int main(int c,char* v) {return 0;}
]], [
AC_DEFINE(HAS_GNU_WARNING_LONG, 1, [Define if .gnu.warning accepts long strings.])
AC_MSG_RESULT(yes)
], [
AC_MSG_RESULT(no)
])

AC_LANG_POP([C])

AM_PROG_LIBTOOL

AC_CONFIG_FILES([
Expand Down
9 changes: 4 additions & 5 deletions libjson.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@

#ifndef __warn_references

#ifdef __GNUC__
#define __warn_references(sym,msg) \
__asm(".pushsection .gnu.warning." #sym "\n" \
".ascii \"" msg "\"\n" \
".popsection");
#if defined(__GNUC__) && defined (HAS_GNU_WARNING_LONG)

#define __warn_references(sym,msg) \
__asm__(".section .gnu" #sym ",\n\t.ascii \"" msg "\"\n\t.text");

#else
#define __warn_references(sym,msg) /* nothing */
Expand Down

0 comments on commit e7e0600

Please sign in to comment.