1272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard/* Copyright (C) 2015 Red Hat, Inc. 2272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard This file is part of elfutils. 3272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 4272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard This file is free software; you can redistribute it and/or modify 5272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard it under the terms of the GNU General Public License as published by 6272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard the Free Software Foundation; either version 3 of the License, or 7272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard (at your option) any later version. 8272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 9272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard elfutils is distributed in the hope that it will be useful, but 10272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard WITHOUT ANY WARRANTY; without even the implied warranty of 11272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GNU General Public License for more details. 13272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 14272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard You should have received a copy of the GNU General Public License 15272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 17272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#ifdef HAVE_CONFIG_H 18272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard# include <config.h> 19272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#endif 20272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 21272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <sys/types.h> 22272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <sys/stat.h> 23272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <fcntl.h> 24272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <inttypes.h> 25272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <libelf.h> 26272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <gelf.h> 27272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <stdbool.h> 28272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <stdio.h> 29272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <stdlib.h> 30272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <string.h> 31272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard#include <unistd.h> 32272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 33272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 34272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaardint 35272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaardmain (int argc, char *argv[]) 36272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard{ 37272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int result = 0; 38272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int cnt; 39272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 40272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (argc < 3 41272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard || (strcmp (argv[1], "elf") != 0 42272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard && strcmp (argv[1], "gnu") != 0)) 43272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 44272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Usage: (elf|gnu) files...\n"); 45272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 46272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 47272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 48272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int gnu; 49272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (strcmp (argv[1], "gnu") == 0) 50272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard gnu = 1; 51272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard else 52272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard gnu = 0; 53272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 54272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard elf_version (EV_CURRENT); 55272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 56272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard for (cnt = 2; cnt < argc; ++cnt) 57272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 58272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int fd = open (argv[cnt], O_RDONLY); 59272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 60272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard Elf *elf = elf_begin (fd, ELF_C_READ, NULL); 61272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (elf == NULL) 62272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 63272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("%s not usable %s\n", argv[cnt], elf_errmsg (-1)); 64272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard result = 1; 65272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard close (fd); 66272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard continue; 67272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 68272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 69272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard /* To get the section names. */ 70272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard size_t strndx; 71272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard elf_getshdrstrndx (elf, &strndx); 72272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 73272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard Elf_Scn *scn = NULL; 74272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard while ((scn = elf_nextscn (elf, scn)) != NULL) 75272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 76272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard size_t idx = elf_ndxscn (scn); 77272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr mem; 78272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr *shdr = gelf_getshdr (scn, &mem); 79272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard const char *name = elf_strptr (elf, strndx, shdr->sh_name); 80519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard if (shdr->sh_type == SHT_NOBITS 81272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard || (shdr->sh_flags & SHF_ALLOC) != 0) 82272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 83272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Cannot compress %zd %s\n", idx, name); 84272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 85272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard else if ((shdr->sh_flags & SHF_COMPRESSED) != 0 8653e447113b60b56fb88109884749133d1b2e0d75Mark Wielaard || strncmp (name, ".zdebug", strlen (".zdebug")) == 0) 87272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 88272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Already compressed %zd %s\n", idx, name); 89272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 90272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard else 91272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 92272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard size_t orig_size = shdr->sh_size; 933a5fc51573ae88a06d2050ef8425336e23013852Mark Wielaard printf ("Lets compress %zd %s, size: %" PRId64 "\n", 94272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx, name, shdr->sh_size); 95272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard Elf_Data *d = elf_getdata (scn, NULL); 96272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (d == NULL) 97272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 98272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Couldn't get orig data for section %zd\n", idx); 99272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 100272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 101272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard /* Make a copy so we can compare after 102272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard compression/decompression. */ 103272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (d->d_size != orig_size) 104272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 105272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Unexpected data size for orig section %zd\n", idx); 106272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 107272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 108272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard char *orig_buf = malloc (d->d_size); 109272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (orig_size > 0 && orig_buf == NULL) 110272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 111272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("No memory to copy section %zd data\n", idx); 112272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 113272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 114272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (orig_size > 0) 115272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard memcpy (orig_buf, d->d_buf, orig_size); 116272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 117272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard bool forced = false; 118272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (gnu) 119272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 120272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int res = elf_compress_gnu (scn, 1, 0); 121272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (res == 0) 122272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 123272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard forced = true; 124272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard res = elf_compress_gnu (scn, 1, ELF_CHF_FORCE); 125272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 126272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (res < 0) 127272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 128272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("elf_compress_gnu%sfailed for section %zd: %s\n", 129272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard forced ? " (forced) " : " ", 130272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx, elf_errmsg (-1)); 131272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 132272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 133272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 134272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard else 135272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 136272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard int res = elf_compress (scn, ELFCOMPRESS_ZLIB, 0); 137272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (res == 0) 138272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 139272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard forced = true; 140272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard res = elf_compress (scn, ELFCOMPRESS_ZLIB, ELF_CHF_FORCE); 141272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 142272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (res < 0) 143272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 144272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("elf_compress%sfailed for section %zd: %s\n", 145272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard forced ? " (forced) " : " ", 146272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx, elf_errmsg (-1)); 147272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 148272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 149272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 150272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr newmem; 151272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr *newshdr = gelf_getshdr (scn, &newmem); 152272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard size_t new_size = newshdr->sh_size; 153272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard d = elf_getdata (scn, NULL); 154272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard // Don't check this, might depend on zlib implementation. 155272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard // fprintf (stderr, " new_size: %zd\n", new_size); 156272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (d->d_size != new_size) 157272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 158272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Unexpected data size for compressed section %zd\n", 159272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx); 160272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 161272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 162272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 163272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (forced && new_size < orig_size) 164272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 165272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("section %zd forced to compress, but size smaller\n", 166272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx); 167272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 168272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 169272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 170272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (! forced && new_size >= orig_size) 171272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 172272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("section %zd compressed to bigger size\n", 173272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx); 174272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 175272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 176272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 177272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (new_size == orig_size 178272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard && memcmp (orig_buf, d->d_buf, orig_size) == 0) 179272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 180272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("section %zd didn't compress\n", idx); 181272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 182272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 183272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 184272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (gnu) 185272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 186272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (elf_compress_gnu (scn, 0, 0) < 0) 187272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 188272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("elf_[un]compress_gnu failed for section %zd: %s\n", 189272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx, elf_errmsg (-1)); 190272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 191272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 192272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 193272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard else 194272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 195272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (elf_compress (scn, 0, 0) < 0) 196272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 197272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("elf_[un]compress failed for section %zd: %s\n", 198272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx, elf_errmsg (-1)); 199272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 200272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 201272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 202272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr newermem; 203272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard GElf_Shdr *newershdr = gelf_getshdr (scn, &newermem); 204272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard size_t newer_size = newershdr->sh_size; 205272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard d = elf_getdata (scn, NULL); 206272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard // fprintf (stderr, " newer_size: %zd\n", newer_size); 207272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (d->d_size != newer_size) 208272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 209272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("Unexpected data size for compressed section %zd\n", 210272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard idx); 211272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 212272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 213272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard if (newer_size != orig_size 214272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard && memcmp (orig_buf, d->d_buf, orig_size) != 0) 215272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard { 216272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard printf ("section %zd didn't correctly uncompress\n", idx); 217272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return -1; 218272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 219272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard free (orig_buf); 220519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard // Recompress the string table, just to make sure 221519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard // everything keeps working. See elf_strptr above. 222519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard if (! gnu && idx == strndx 223519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard && elf_compress (scn, ELFCOMPRESS_ZLIB, 0) < 0) 224519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard { 225519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard printf ("couldn't recompress section header strings: %s\n", 226519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard elf_errmsg (-1)); 227519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard return -1; 228519c13c9c7fc591609eed405a3e952707c60ec7eMark Wielaard } 229272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 230272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 231272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 232272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard elf_end (elf); 233272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard close (fd); 234272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard } 235272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard 236272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard return result; 237272018bba1f253bae00b5ba280ad0e0f18c04006Mark Wielaard} 238