From fb5b547845302fe64f118f9bc5eb0ef636cfafb7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 13 Oct 2004 14:33:51 +0000 Subject: [PATCH] * strings.c (statbuf): New typedef. (file_stat): Define. (strings_object_file): Avoid using get_file_size, instead do the checks here, using file_stat. * configure.in (HAVE_STAT64): New test. * configure: Rebuilt. * config.in: Rebuilt. --- binutils/ChangeLog | 10 ++++++++ binutils/config.in | 3 +++ binutils/configure | 60 ++++++++++++++++++++++++++++++++++++++++--- binutils/configure.in | 25 +++++++++++++++--- binutils/strings.c | 20 +++++++++++++-- 5 files changed, 109 insertions(+), 9 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index f9da6d9ee6..bb1997773f 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,13 @@ +2004-10-13 Jakub Jelinek + + * strings.c (statbuf): New typedef. + (file_stat): Define. + (strings_object_file): Avoid using get_file_size, instead do the + checks here, using file_stat. + * configure.in (HAVE_STAT64): New test. + * configure: Rebuilt. + * config.in: Rebuilt. + 2004-10-12 Paul Brook * readelf.c (decode_ARM_machine_flags): Support EABI version 4. diff --git a/binutils/config.in b/binutils/config.in index f2bd049558..76d3b815bd 100644 --- a/binutils/config.in +++ b/binutils/config.in @@ -166,6 +166,9 @@ /* Is fopen64 available? */ #undef HAVE_FOPEN64 +/* Is stat64 available? */ +#undef HAVE_STAT64 + /* Enable LFS */ #undef _LARGEFILE64_SOURCE diff --git a/binutils/configure b/binutils/configure index fef4fbc39c..59a1b59135 100755 --- a/binutils/configure +++ b/binutils/configure @@ -5035,12 +5035,66 @@ if test "$bu_cv_have_fopen64" != no; then #define HAVE_FOPEN64 1 EOF - if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE"; then - cat >> confdefs.h <<\EOF +fi +echo $ac_n "checking for stat64""... $ac_c" 1>&6 +echo "configure:5054: checking for stat64" >&5 +if eval "test \"`echo '$''{'bu_cv_have_stat64'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +struct stat64 st; stat64 ("/tmp/foo", &st); +; return 0; } +EOF +if { (eval echo configure:5066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + bu_cv_have_stat64=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + saved_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + cat > conftest.$ac_ext < +int main() { +struct stat64 st; stat64 ("/tmp/foo", &st); +; return 0; } +EOF +if { (eval echo configure:5083: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + bu_cv_have_stat64="need -D_LARGEFILE64_SOURCE" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + bu_cv_have_stat64=no +fi +rm -f conftest* + CPPFLAGS=$saved_CPPFLAGS +fi +rm -f conftest* +fi + +echo "$ac_t""$bu_cv_have_stat64" 1>&6 +if test "$bu_cv_have_stat64" != no; then + cat >> confdefs.h <<\EOF +#define HAVE_STAT64 1 +EOF + +fi +if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE" \ + || test "$bu_cv_have_stat64" = "need -D_LARGEFILE64_SOURCE"; then + cat >> confdefs.h <<\EOF #define _LARGEFILE64_SOURCE 1 EOF - fi + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" fi # Some systems have frexp only in -lm, not in -lc. diff --git a/binutils/configure.in b/binutils/configure.in index 8889084398..3eaa825164 100644 --- a/binutils/configure.in +++ b/binutils/configure.in @@ -118,10 +118,27 @@ AC_MSG_RESULT($bu_cv_have_fopen64) if test "$bu_cv_have_fopen64" != no; then AC_DEFINE([HAVE_FOPEN64], 1, [Is fopen64 available?]) - if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE"; then - AC_DEFINE([_LARGEFILE64_SOURCE], 1, - [Enable LFS]) - fi +fi +AC_MSG_CHECKING([for stat64]) +AC_CACHE_VAL(bu_cv_have_stat64, +[AC_TRY_LINK([#include ], [struct stat64 st; stat64 ("/tmp/foo", &st);], +bu_cv_have_stat64=yes, +[saved_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + AC_TRY_LINK([#include ], [struct stat64 st; stat64 ("/tmp/foo", &st);], +bu_cv_have_stat64="need -D_LARGEFILE64_SOURCE", +bu_cv_have_stat64=no) + CPPFLAGS=$saved_CPPFLAGS])]) +AC_MSG_RESULT($bu_cv_have_stat64) +if test "$bu_cv_have_stat64" != no; then + AC_DEFINE([HAVE_STAT64], 1, + [Is stat64 available?]) +fi +if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE" \ + || test "$bu_cv_have_stat64" = "need -D_LARGEFILE64_SOURCE"; then + AC_DEFINE([_LARGEFILE64_SOURCE], 1, + [Enable LFS]) + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" fi # Some systems have frexp only in -lm, not in -lc. diff --git a/binutils/strings.c b/binutils/strings.c index 8a27fa800e..17dbc7c2a8 100644 --- a/binutils/strings.c +++ b/binutils/strings.c @@ -104,6 +104,13 @@ typedef off64_t file_off; typedef off_t file_off; #define file_open(s,m) fopen(s, m) #endif +#ifdef HAVE_STAT64 +typedef struct stat64 statbuf; +#define file_stat(f,s) stat64(f, s) +#else +typedef struct stat statbuf; +#define file_stat(f,s) stat(f, s) +#endif /* Radix for printing addresses (must be 8, 10 or 16). */ static int address_radix; @@ -370,8 +377,17 @@ strings_object_file (const char *file) static bfd_boolean strings_file (char *file) { - if (get_file_size (file) < 1) - return FALSE; + statbuf st; + + if (file_stat (file, &st) < 0) + { + if (errno == ENOENT) + non_fatal (_("'%s': No such file"), file); + else + non_fatal (_("Warning: could not locate '%s'. reason: %s"), + file, strerror (errno)); + return FALSE; + } /* If we weren't told to scan the whole file, try to open it as an object file and only look at