--- elfutils-0.149/src/addr2line.c.orig 2010-10-24 10:15:08.419741882 +0200 +++ elfutils-0.149/src/addr2line.c 2010-10-24 10:16:59.475738529 +0200 @@ -445,6 +445,12 @@ return false; } +#if ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 7))) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +# define SCANF_ADDR "m" +#else +# define SCANF_ADDR "a" +#endif + static int handle_address (const char *string, Dwfl *dwfl) { @@ -455,10 +461,10 @@ bool parsed = false; int i, j; char *name = NULL; - if (sscanf (string, "(%a[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 + if (sscanf (string, "(%" SCANF_ADDR "[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 && string[i] == '\0') parsed = adjust_to_section (name, &addr, dwfl); - switch (sscanf (string, "%a[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) + switch (sscanf (string, "%" SCANF_ADDR "[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) { default: break; --- elfutils-0.159/tests/line2addr.c.orig 2014-06-14 15:29:20.255060523 +0200 +++ elfutils-0.159/tests/line2addr.c 2014-06-14 16:01:01.691687560 +0200 @@ -108,6 +108,12 @@ return DWARF_CB_OK; } +#if ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 7))) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +# define SCANF_ADDR "m" +#else +# define SCANF_ADDR "a" +#endif + int main (int argc, char *argv[]) { @@ -124,7 +130,7 @@ { struct args a = { .arg = argv[cnt] }; - switch (sscanf (a.arg, "%a[^:]:%d", &a.file, &a.line)) + switch (sscanf (a.arg, "%" SCANF_ADDR "[^:]:%d", &a.file, &a.line)) { default: case 0: