From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id 63AC73852C47; Mon, 21 Nov 2022 21:51:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 63AC73852C47 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: bfd-cvs@sourceware.org Subject: [binutils-gdb] readelf: use fseeko64 or fseeko if possible X-Act-Checkin: binutils-gdb X-Git-Author: Brett Werling X-Git-Refname: refs/heads/master X-Git-Oldrev: 38c917d808fdb570ddb1215ccf8233a10484ba91 X-Git-Newrev: d82e33deccc23f7198e20177f6164323201064eb Message-Id: <20221121215136.63AC73852C47@sourceware.org> Date: Mon, 21 Nov 2022 21:51:36 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Nov 2022 21:51:36 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Dd82e33deccc2= 3f7198e20177f6164323201064eb commit d82e33deccc23f7198e20177f6164323201064eb Author: Brett Werling Date: Thu Nov 17 08:34:19 2022 -0600 readelf: use fseeko64 or fseeko if possible =20 Changes readelf to make use first of fseeko64 and then fseeko, depending on which of those is available. If neither is available, reverts to the previous behavior of using fseek. =20 This is necessary when building readelf for LLP64 systems, where a long will only be 32 bits wide. If the elf file in question is >=3D 2 G= iB, that is greater than the max long value and therefore fseek will fail indicating that the offset is negative. On such systems, making use of fseeko64 or fseeko will result in the ability so seek past the 2 GiB max long boundary. =20 Note that large archive handling in readelf remains to be fixed. Diff: --- binutils/config.in | 6 ++++++ binutils/configure | 2 +- binutils/readelf.c | 30 +++++++++++++++++++----------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/binutils/config.in b/binutils/config.in index 4d22a80971b..91fe00af777 100644 --- a/binutils/config.in +++ b/binutils/config.in @@ -67,6 +67,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H =20 +/* Define to 1 if you have the `fseeko' function. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `fseeko64' function. */ +#undef HAVE_FSEEKO64 + /* Define to 1 if you have the `getc_unlocked' function. */ #undef HAVE_GETC_UNLOCKED =20 diff --git a/binutils/configure b/binutils/configure index 6176d699e57..46519a31701 100755 --- a/binutils/configure +++ b/binutils/configure @@ -13155,7 +13155,7 @@ $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt =20 -for ac_func in getc_unlocked mkdtemp mkstemp utimensat utimes +for ac_func in getc_unlocked mkdtemp mkstemp utimensat utimes fseeko fseek= o64 do : as_ac_var=3D`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/binutils/readelf.c b/binutils/readelf.c index 6b2cbbcbb1b..044022ec334 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -178,6 +178,14 @@ #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER)) #endif =20 +#if defined (HAVE_FSEEKO64) +#define FSEEK_FUNC fseeko64 +#elif defined (HAVE_FSEEKO) +#define FSEEK_FUNC fseeko +#else +#define FSEEK_FUNC fseek +#endif + typedef struct elf_section_list { Elf_Internal_Shdr * hdr; @@ -482,7 +490,7 @@ get_data (void *var, return NULL; } =20 - if (fseek (filedata->handle, filedata->archive_file_offset + offset, + if (FSEEK_FUNC (filedata->handle, filedata->archive_file_offset + offset, SEEK_SET)) { if (reason) @@ -6283,7 +6291,7 @@ the .dynamic section is not the same as the dynamic s= egment\n")); if (segment->p_offset >=3D filedata->file_size || segment->p_filesz > filedata->file_size - segment->p_offset || segment->p_filesz - 1 >=3D (size_t) -2 - || fseek (filedata->handle, + || FSEEK_FUNC (filedata->handle, filedata->archive_file_offset + (long) segment->p_offset, SEEK_SET)) error (_("Unable to find program interpreter name\n")); @@ -11056,7 +11064,7 @@ get_num_dynamic_syms (Filedata * filedata) && filedata->file_header.e_ident[EI_CLASS] =3D=3D ELFCLASS64) hash_ent_size =3D 8; =20 - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, filedata->dynamic_info[DT_HASH], sizeof nb + sizeof nc)), @@ -11109,7 +11117,7 @@ get_num_dynamic_syms (Filedata * filedata) uint64_t buckets_vma; unsigned long hn; =20 - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, filedata->dynamic_info_DT_GNU_HASH, @@ -11135,7 +11143,7 @@ get_num_dynamic_syms (Filedata * filedata) else buckets_vma +=3D bitmaskwords * 8; =20 - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, buckets_vma, 4)), SEEK_SET)) @@ -11165,7 +11173,7 @@ get_num_dynamic_syms (Filedata * filedata) =20 maxchain -=3D filedata->gnusymidx; =20 - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, buckets_vma + 4 * (filedata->ngnubuckets @@ -11192,7 +11200,7 @@ get_num_dynamic_syms (Filedata * filedata) } while ((byte_get (nb, 4) & 1) =3D=3D 0); =20 - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, (buckets_vma + 4 * filedata->ngnubuckets), @@ -11211,7 +11219,7 @@ get_num_dynamic_syms (Filedata * filedata) =20 if (filedata->dynamic_info_DT_MIPS_XHASH) { - if (fseek (filedata->handle, + if (FSEEK_FUNC (filedata->handle, (filedata->archive_file_offset + offset_from_vma (filedata, (buckets_vma + 4 * (filedata->ngnubuckets @@ -22610,7 +22618,7 @@ process_archive (Filedata * filedata, bool is_thin_= archive) ret =3D false; } =20 - if (fseek (filedata->handle, current_pos, SEEK_SET) !=3D 0) + if (FSEEK_FUNC (filedata->handle, current_pos, SEEK_SET) !=3D 0) { error (_("%s: failed to seek back to start of object files " "in the archive\n"), @@ -22637,7 +22645,7 @@ process_archive (Filedata * filedata, bool is_thin_= archive) char * qualified_name; =20 /* Read the next archive header. */ - if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) !=3D = 0) + if (FSEEK_FUNC (filedata->handle, arch.next_arhdr_offset, SEEK_SET) = !=3D 0) { error (_("%s: failed to seek to next archive header\n"), arch.file_name); @@ -22747,7 +22755,7 @@ process_archive (Filedata * filedata, bool is_thin_= archive) =20 /* The nested archive file will have been opened and setup by get_archive_member_name. */ - if (fseek (nested_arch.file, filedata->archive_file_offset, + if (FSEEK_FUNC (nested_arch.file, filedata->archive_file_offset, SEEK_SET) !=3D 0) { error (_("%s: failed to seek to archive member.\n"),