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