1da0c48c4Sopenharmony_ci/* Test program for elf_strptr function. 2da0c48c4Sopenharmony_ci Copyright (C) 2015 Red Hat, Inc. 3da0c48c4Sopenharmony_ci This file is part of elfutils. 4da0c48c4Sopenharmony_ci 5da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 6da0c48c4Sopenharmony_ci it under the terms of the GNU General Public License as published by 7da0c48c4Sopenharmony_ci the Free Software Foundation; either version 3 of the License, or 8da0c48c4Sopenharmony_ci (at your option) any later version. 9da0c48c4Sopenharmony_ci 10da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 11da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 12da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13da0c48c4Sopenharmony_ci GNU General Public License for more details. 14da0c48c4Sopenharmony_ci 15da0c48c4Sopenharmony_ci You should have received a copy of the GNU General Public License 16da0c48c4Sopenharmony_ci along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17da0c48c4Sopenharmony_ci 18da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H 19da0c48c4Sopenharmony_ci# include <config.h> 20da0c48c4Sopenharmony_ci#endif 21da0c48c4Sopenharmony_ci 22da0c48c4Sopenharmony_ci#include <errno.h> 23da0c48c4Sopenharmony_ci#include <fcntl.h> 24da0c48c4Sopenharmony_ci#include <inttypes.h> 25da0c48c4Sopenharmony_ci#include <stdio.h> 26da0c48c4Sopenharmony_ci#include <stdlib.h> 27da0c48c4Sopenharmony_ci#include <string.h> 28da0c48c4Sopenharmony_ci#include <unistd.h> 29da0c48c4Sopenharmony_ci#include "system.h" 30da0c48c4Sopenharmony_ci 31da0c48c4Sopenharmony_ci#include ELFUTILS_HEADER(elf) 32da0c48c4Sopenharmony_ci#include <gelf.h> 33da0c48c4Sopenharmony_ci 34da0c48c4Sopenharmony_ci 35da0c48c4Sopenharmony_ci/* Index of last string added. Returned by add_string (). */ 36da0c48c4Sopenharmony_cistatic size_t stridx = 0; 37da0c48c4Sopenharmony_ci 38da0c48c4Sopenharmony_ci/* Some random strings. */ 39da0c48c4Sopenharmony_cistatic char *str1; 40da0c48c4Sopenharmony_cistatic size_t str1_off; 41da0c48c4Sopenharmony_cistatic char *str2; 42da0c48c4Sopenharmony_cistatic size_t str2_off; 43da0c48c4Sopenharmony_cistatic char *str3; 44da0c48c4Sopenharmony_cistatic size_t str3_off; 45da0c48c4Sopenharmony_ci 46da0c48c4Sopenharmony_ci/* First three strings we write out. They should always be there. */ 47da0c48c4Sopenharmony_cistatic char *orig_str1; 48da0c48c4Sopenharmony_cistatic size_t orig_str1_off; 49da0c48c4Sopenharmony_cistatic char *orig_str2; 50da0c48c4Sopenharmony_cistatic size_t orig_str2_off; 51da0c48c4Sopenharmony_cistatic char *orig_str3; 52da0c48c4Sopenharmony_cistatic size_t orig_str3_off; 53da0c48c4Sopenharmony_ci 54da0c48c4Sopenharmony_cistatic void 55da0c48c4Sopenharmony_cicheck_orig_strings (Elf *elf, int ndx, const char *msg) 56da0c48c4Sopenharmony_ci{ 57da0c48c4Sopenharmony_ci printf ("checking orig strings: %s\n", msg); 58da0c48c4Sopenharmony_ci 59da0c48c4Sopenharmony_ci const char *str = elf_strptr (elf, ndx, 0); 60da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 61da0c48c4Sopenharmony_ci if (str == NULL || strcmp ("", str) != 0) 62da0c48c4Sopenharmony_ci exit (1); 63da0c48c4Sopenharmony_ci 64da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, 1); 65da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 66da0c48c4Sopenharmony_ci if (str == NULL || strcmp (".strings", str) != 0) 67da0c48c4Sopenharmony_ci exit (1); 68da0c48c4Sopenharmony_ci 69da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, orig_str1_off); 70da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 71da0c48c4Sopenharmony_ci if (str == NULL || strcmp (orig_str1, str) != 0) 72da0c48c4Sopenharmony_ci exit (1); 73da0c48c4Sopenharmony_ci 74da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, orig_str2_off); 75da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 76da0c48c4Sopenharmony_ci if (str == NULL || strcmp (orig_str2, str) != 0) 77da0c48c4Sopenharmony_ci exit (1); 78da0c48c4Sopenharmony_ci 79da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, orig_str3_off); 80da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 81da0c48c4Sopenharmony_ci if (str == NULL || strcmp (orig_str3, str) != 0) 82da0c48c4Sopenharmony_ci exit (1); 83da0c48c4Sopenharmony_ci} 84da0c48c4Sopenharmony_ci 85da0c48c4Sopenharmony_cistatic void 86da0c48c4Sopenharmony_cicheck_strings (Elf *elf, int ndx, const char *msg) 87da0c48c4Sopenharmony_ci{ 88da0c48c4Sopenharmony_ci check_orig_strings (elf, ndx, msg); 89da0c48c4Sopenharmony_ci 90da0c48c4Sopenharmony_ci const char *str = elf_strptr (elf, ndx, str1_off); 91da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 92da0c48c4Sopenharmony_ci if (str == NULL || strcmp (str1, str) != 0) 93da0c48c4Sopenharmony_ci exit (1); 94da0c48c4Sopenharmony_ci 95da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, str2_off); 96da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 97da0c48c4Sopenharmony_ci if (str == NULL || strcmp (str2, str) != 0) 98da0c48c4Sopenharmony_ci exit (1); 99da0c48c4Sopenharmony_ci 100da0c48c4Sopenharmony_ci str = elf_strptr (elf, ndx, str3_off); 101da0c48c4Sopenharmony_ci printf ("\t'%s'\n", str); 102da0c48c4Sopenharmony_ci if (str == NULL || strcmp (str3, str) != 0) 103da0c48c4Sopenharmony_ci exit (1); 104da0c48c4Sopenharmony_ci} 105da0c48c4Sopenharmony_ci 106da0c48c4Sopenharmony_ci/* Adds a string and returns the offset in the section. */ 107da0c48c4Sopenharmony_cistatic size_t 108da0c48c4Sopenharmony_ciadd_string (Elf_Scn *scn, char *str) 109da0c48c4Sopenharmony_ci{ 110da0c48c4Sopenharmony_ci size_t lastidx = stridx; 111da0c48c4Sopenharmony_ci size_t size = strlen (str) + 1; 112da0c48c4Sopenharmony_ci 113da0c48c4Sopenharmony_ci Elf_Data *data = elf_newdata (scn); 114da0c48c4Sopenharmony_ci if (data == NULL) 115da0c48c4Sopenharmony_ci { 116da0c48c4Sopenharmony_ci printf ("cannot create data SHSTRTAB section: %s\n", elf_errmsg (-1)); 117da0c48c4Sopenharmony_ci exit (1); 118da0c48c4Sopenharmony_ci } 119da0c48c4Sopenharmony_ci 120da0c48c4Sopenharmony_ci data->d_buf = str; 121da0c48c4Sopenharmony_ci data->d_type = ELF_T_BYTE; 122da0c48c4Sopenharmony_ci data->d_size = size; 123da0c48c4Sopenharmony_ci data->d_align = 1; 124da0c48c4Sopenharmony_ci data->d_version = EV_CURRENT; 125da0c48c4Sopenharmony_ci 126da0c48c4Sopenharmony_ci stridx += size; 127da0c48c4Sopenharmony_ci printf ("add_string: '%s', stridx: %zd, lastidx: %zd\n", 128da0c48c4Sopenharmony_ci str, stridx, lastidx); 129da0c48c4Sopenharmony_ci return lastidx; 130da0c48c4Sopenharmony_ci} 131da0c48c4Sopenharmony_ci 132da0c48c4Sopenharmony_cistatic void 133da0c48c4Sopenharmony_cicheck_elf (const char *fname, int class, int use_mmap) 134da0c48c4Sopenharmony_ci{ 135da0c48c4Sopenharmony_ci printf ("\nfname: %s\n", fname); 136da0c48c4Sopenharmony_ci stridx = 0; 137da0c48c4Sopenharmony_ci 138da0c48c4Sopenharmony_ci int fd = open (fname, O_RDWR | O_CREAT | O_TRUNC, DEFFILEMODE); 139da0c48c4Sopenharmony_ci if (fd == -1) 140da0c48c4Sopenharmony_ci { 141da0c48c4Sopenharmony_ci printf ("cannot open `%s': %s\n", fname, strerror (errno)); 142da0c48c4Sopenharmony_ci exit (1); 143da0c48c4Sopenharmony_ci } 144da0c48c4Sopenharmony_ci 145da0c48c4Sopenharmony_ci Elf *elf = elf_begin (fd, use_mmap ? ELF_C_WRITE_MMAP : ELF_C_WRITE, NULL); 146da0c48c4Sopenharmony_ci if (elf == NULL) 147da0c48c4Sopenharmony_ci { 148da0c48c4Sopenharmony_ci printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1)); 149da0c48c4Sopenharmony_ci exit (1); 150da0c48c4Sopenharmony_ci } 151da0c48c4Sopenharmony_ci 152da0c48c4Sopenharmony_ci // Create an ELF header. 153da0c48c4Sopenharmony_ci if (gelf_newehdr (elf, class) == 0) 154da0c48c4Sopenharmony_ci { 155da0c48c4Sopenharmony_ci printf ("cannot create ELF header: %s\n", elf_errmsg (-1)); 156da0c48c4Sopenharmony_ci exit (1); 157da0c48c4Sopenharmony_ci } 158da0c48c4Sopenharmony_ci 159da0c48c4Sopenharmony_ci GElf_Ehdr ehdr_mem; 160da0c48c4Sopenharmony_ci GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem); 161da0c48c4Sopenharmony_ci if (ehdr == NULL) 162da0c48c4Sopenharmony_ci { 163da0c48c4Sopenharmony_ci printf ("cannot get ELF header: %s\n", elf_errmsg (-1)); 164da0c48c4Sopenharmony_ci exit (1); 165da0c48c4Sopenharmony_ci } 166da0c48c4Sopenharmony_ci 167da0c48c4Sopenharmony_ci // Initialize header. 168da0c48c4Sopenharmony_ci ehdr->e_ident[EI_DATA] = class == ELFCLASS64 ? ELFDATA2LSB : ELFDATA2MSB; 169da0c48c4Sopenharmony_ci ehdr->e_ident[EI_OSABI] = ELFOSABI_GNU; 170da0c48c4Sopenharmony_ci ehdr->e_type = ET_NONE; 171da0c48c4Sopenharmony_ci ehdr->e_machine = EM_X86_64; 172da0c48c4Sopenharmony_ci ehdr->e_version = EV_CURRENT; 173da0c48c4Sopenharmony_ci 174da0c48c4Sopenharmony_ci // Create strings section. 175da0c48c4Sopenharmony_ci Elf_Scn *scn = elf_newscn (elf); 176da0c48c4Sopenharmony_ci if (scn == NULL) 177da0c48c4Sopenharmony_ci { 178da0c48c4Sopenharmony_ci printf ("cannot create strings section: %s\n", elf_errmsg (-1)); 179da0c48c4Sopenharmony_ci exit (1); 180da0c48c4Sopenharmony_ci } 181da0c48c4Sopenharmony_ci 182da0c48c4Sopenharmony_ci // Add an empty string to the table as NUL entry for section zero. 183da0c48c4Sopenharmony_ci add_string (scn, ""); 184da0c48c4Sopenharmony_ci 185da0c48c4Sopenharmony_ci GElf_Shdr shdr_mem; 186da0c48c4Sopenharmony_ci GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 187da0c48c4Sopenharmony_ci if (shdr == NULL) 188da0c48c4Sopenharmony_ci { 189da0c48c4Sopenharmony_ci printf ("cannot get header for strings section: %s\n", elf_errmsg (-1)); 190da0c48c4Sopenharmony_ci exit (1); 191da0c48c4Sopenharmony_ci } 192da0c48c4Sopenharmony_ci 193da0c48c4Sopenharmony_ci shdr->sh_type = SHT_STRTAB; 194da0c48c4Sopenharmony_ci shdr->sh_flags = 0; 195da0c48c4Sopenharmony_ci shdr->sh_addr = 0; 196da0c48c4Sopenharmony_ci shdr->sh_link = SHN_UNDEF; 197da0c48c4Sopenharmony_ci shdr->sh_info = SHN_UNDEF; 198da0c48c4Sopenharmony_ci shdr->sh_addralign = 1; 199da0c48c4Sopenharmony_ci shdr->sh_entsize = 0; 200da0c48c4Sopenharmony_ci shdr->sh_name = add_string (scn, ".strings"); 201da0c48c4Sopenharmony_ci 202da0c48c4Sopenharmony_ci // We have to store the section strtab index in the ELF header. 203da0c48c4Sopenharmony_ci // So sections have actual names. 204da0c48c4Sopenharmony_ci int ndx = elf_ndxscn (scn); 205da0c48c4Sopenharmony_ci ehdr->e_shstrndx = ndx; 206da0c48c4Sopenharmony_ci 207da0c48c4Sopenharmony_ci if (gelf_update_ehdr (elf, ehdr) == 0) 208da0c48c4Sopenharmony_ci { 209da0c48c4Sopenharmony_ci printf ("cannot update ELF header: %s\n", elf_errmsg (-1)); 210da0c48c4Sopenharmony_ci exit (1); 211da0c48c4Sopenharmony_ci } 212da0c48c4Sopenharmony_ci 213da0c48c4Sopenharmony_ci // Add some random strings. These are the original ones. They should 214da0c48c4Sopenharmony_ci // always be there (together with the empty "" and .strings section 215da0c48c4Sopenharmony_ci // name strings. 216da0c48c4Sopenharmony_ci orig_str1 = "elfutils"; 217da0c48c4Sopenharmony_ci orig_str1_off = add_string (scn, orig_str1); 218da0c48c4Sopenharmony_ci orig_str2 = "strtabelf"; 219da0c48c4Sopenharmony_ci orig_str2_off = add_string (scn, orig_str2); 220da0c48c4Sopenharmony_ci orig_str3 = "three"; 221da0c48c4Sopenharmony_ci orig_str3_off = add_string (scn, orig_str3); 222da0c48c4Sopenharmony_ci 223da0c48c4Sopenharmony_ci // Finished strings section, update the header. 224da0c48c4Sopenharmony_ci if (gelf_update_shdr (scn, shdr) == 0) 225da0c48c4Sopenharmony_ci { 226da0c48c4Sopenharmony_ci printf ("cannot update STRTAB section header: %s\n", elf_errmsg (-1)); 227da0c48c4Sopenharmony_ci exit (1); 228da0c48c4Sopenharmony_ci } 229da0c48c4Sopenharmony_ci 230da0c48c4Sopenharmony_ci // Let the library compute the internal structure information. 231da0c48c4Sopenharmony_ci if (elf_update (elf, ELF_C_NULL) < 0) 232da0c48c4Sopenharmony_ci { 233da0c48c4Sopenharmony_ci printf ("failure in elf_update(NULL): %s\n", elf_errmsg (-1)); 234da0c48c4Sopenharmony_ci exit (1); 235da0c48c4Sopenharmony_ci } 236da0c48c4Sopenharmony_ci 237da0c48c4Sopenharmony_ci // Check our strings are there. 238da0c48c4Sopenharmony_ci check_orig_strings (elf, ndx, "first elf_update, before write"); 239da0c48c4Sopenharmony_ci 240da0c48c4Sopenharmony_ci // Write everything to disk. 241da0c48c4Sopenharmony_ci if (elf_update (elf, ELF_C_WRITE) < 0) 242da0c48c4Sopenharmony_ci { 243da0c48c4Sopenharmony_ci printf ("failure in elf_update(WRITE): %s\n", elf_errmsg (-1)); 244da0c48c4Sopenharmony_ci exit (1); 245da0c48c4Sopenharmony_ci } 246da0c48c4Sopenharmony_ci 247da0c48c4Sopenharmony_ci // Check out strings are there. 248da0c48c4Sopenharmony_ci check_orig_strings (elf, ndx, "first elf_update, after write"); 249da0c48c4Sopenharmony_ci 250da0c48c4Sopenharmony_ci // Add some more random strings. These will not be written to disk. 251da0c48c4Sopenharmony_ci scn = elf_getscn (elf, ndx); 252da0c48c4Sopenharmony_ci if (scn == NULL) 253da0c48c4Sopenharmony_ci { 254da0c48c4Sopenharmony_ci printf ("couldn't re-get strings section: %s\n", elf_errmsg (-1)); 255da0c48c4Sopenharmony_ci exit (1); 256da0c48c4Sopenharmony_ci } 257da0c48c4Sopenharmony_ci 258da0c48c4Sopenharmony_ci str1 = "elfutils2"; 259da0c48c4Sopenharmony_ci str1_off = add_string (scn, str1); 260da0c48c4Sopenharmony_ci str2 = "strtabelf2"; 261da0c48c4Sopenharmony_ci str2_off = add_string (scn, str2); 262da0c48c4Sopenharmony_ci str3 = "three2"; 263da0c48c4Sopenharmony_ci str3_off = add_string (scn, str3); 264da0c48c4Sopenharmony_ci 265da0c48c4Sopenharmony_ci // Update internal structure information again. 266da0c48c4Sopenharmony_ci if (elf_update (elf, ELF_C_NULL) < 0) 267da0c48c4Sopenharmony_ci { 268da0c48c4Sopenharmony_ci printf ("failure in re-elf_update(NULL): %s\n", elf_errmsg (-1)); 269da0c48c4Sopenharmony_ci exit (1); 270da0c48c4Sopenharmony_ci } 271da0c48c4Sopenharmony_ci 272da0c48c4Sopenharmony_ci // Check our new strings are there. 273da0c48c4Sopenharmony_ci check_strings (elf, ndx, "first extra strings"); 274da0c48c4Sopenharmony_ci 275da0c48c4Sopenharmony_ci if (elf_end (elf) != 0) 276da0c48c4Sopenharmony_ci { 277da0c48c4Sopenharmony_ci printf ("failure in elf_end: %s\n", elf_errmsg (-1)); 278da0c48c4Sopenharmony_ci exit (1); 279da0c48c4Sopenharmony_ci } 280da0c48c4Sopenharmony_ci 281da0c48c4Sopenharmony_ci close (fd); 282da0c48c4Sopenharmony_ci 283da0c48c4Sopenharmony_ci /* Read the ELF from disk now. */ 284da0c48c4Sopenharmony_ci fd = open (fname, O_RDWR); 285da0c48c4Sopenharmony_ci if (fd == -1) 286da0c48c4Sopenharmony_ci { 287da0c48c4Sopenharmony_ci printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno)); 288da0c48c4Sopenharmony_ci exit (1); 289da0c48c4Sopenharmony_ci } 290da0c48c4Sopenharmony_ci 291da0c48c4Sopenharmony_ci elf = elf_begin (fd, use_mmap ? ELF_C_RDWR_MMAP : ELF_C_RDWR, NULL); 292da0c48c4Sopenharmony_ci if (elf == NULL) 293da0c48c4Sopenharmony_ci { 294da0c48c4Sopenharmony_ci printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1)); 295da0c48c4Sopenharmony_ci exit (1); 296da0c48c4Sopenharmony_ci } 297da0c48c4Sopenharmony_ci 298da0c48c4Sopenharmony_ci /* Are our strings there? */ 299da0c48c4Sopenharmony_ci check_orig_strings (elf, ndx, "read ELF file, orig strings"); 300da0c48c4Sopenharmony_ci 301da0c48c4Sopenharmony_ci // Add some more random strings. 302da0c48c4Sopenharmony_ci scn = elf_getscn (elf, ndx); 303da0c48c4Sopenharmony_ci if (scn == NULL) 304da0c48c4Sopenharmony_ci { 305da0c48c4Sopenharmony_ci printf ("couldn't re-get strings section: %s\n", elf_errmsg (-1)); 306da0c48c4Sopenharmony_ci exit (1); 307da0c48c4Sopenharmony_ci } 308da0c48c4Sopenharmony_ci 309da0c48c4Sopenharmony_ci shdr = gelf_getshdr (scn, &shdr_mem); 310da0c48c4Sopenharmony_ci if (shdr == NULL) 311da0c48c4Sopenharmony_ci { 312da0c48c4Sopenharmony_ci printf ("cannot get header for strings section: %s\n", elf_errmsg (-1)); 313da0c48c4Sopenharmony_ci exit (1); 314da0c48c4Sopenharmony_ci } 315da0c48c4Sopenharmony_ci 316da0c48c4Sopenharmony_ci // Reset stridx to end of section. 317da0c48c4Sopenharmony_ci printf ("sh_size: %" PRIu64 "\n", shdr->sh_size); 318da0c48c4Sopenharmony_ci stridx = shdr->sh_size; 319da0c48c4Sopenharmony_ci 320da0c48c4Sopenharmony_ci str1 = "0123456789"; 321da0c48c4Sopenharmony_ci str1_off = add_string (scn, str1); 322da0c48c4Sopenharmony_ci str2 = "supercalifragilisticexpialidocious"; 323da0c48c4Sopenharmony_ci str2_off = add_string (scn, str2); 324da0c48c4Sopenharmony_ci str3 = "forty-two"; 325da0c48c4Sopenharmony_ci str3_off = add_string (scn, str3); 326da0c48c4Sopenharmony_ci 327da0c48c4Sopenharmony_ci // Update internal structure information. 328da0c48c4Sopenharmony_ci if (elf_update (elf, ELF_C_NULL) < 0) 329da0c48c4Sopenharmony_ci { 330da0c48c4Sopenharmony_ci printf ("failure in rw-elf_update(NULL): %s\n", elf_errmsg (-1)); 331da0c48c4Sopenharmony_ci exit (1); 332da0c48c4Sopenharmony_ci } 333da0c48c4Sopenharmony_ci 334da0c48c4Sopenharmony_ci /* Check our new strings are there. */ 335da0c48c4Sopenharmony_ci check_strings (elf, ndx, "read file, added strings"); 336da0c48c4Sopenharmony_ci 337da0c48c4Sopenharmony_ci // Write updated ELF file. 338da0c48c4Sopenharmony_ci if (elf_update (elf, ELF_C_WRITE) < 0) 339da0c48c4Sopenharmony_ci { 340da0c48c4Sopenharmony_ci printf ("failure in re-elf_update(NULL): %s\n", elf_errmsg (-1)); 341da0c48c4Sopenharmony_ci exit (1); 342da0c48c4Sopenharmony_ci } 343da0c48c4Sopenharmony_ci 344da0c48c4Sopenharmony_ci if (elf_end (elf) != 0) 345da0c48c4Sopenharmony_ci { 346da0c48c4Sopenharmony_ci printf ("failure in elf_end: %s\n", elf_errmsg (-1)); 347da0c48c4Sopenharmony_ci exit (1); 348da0c48c4Sopenharmony_ci } 349da0c48c4Sopenharmony_ci 350da0c48c4Sopenharmony_ci close (fd); 351da0c48c4Sopenharmony_ci 352da0c48c4Sopenharmony_ci // And read it in one last time. 353da0c48c4Sopenharmony_ci fd = open (fname, O_RDONLY); 354da0c48c4Sopenharmony_ci if (fd == -1) 355da0c48c4Sopenharmony_ci { 356da0c48c4Sopenharmony_ci printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno)); 357da0c48c4Sopenharmony_ci exit (1); 358da0c48c4Sopenharmony_ci } 359da0c48c4Sopenharmony_ci 360da0c48c4Sopenharmony_ci elf = elf_begin (fd, use_mmap ? ELF_C_READ_MMAP : ELF_C_READ, NULL); 361da0c48c4Sopenharmony_ci if (elf == NULL) 362da0c48c4Sopenharmony_ci { 363da0c48c4Sopenharmony_ci printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1)); 364da0c48c4Sopenharmony_ci exit (1); 365da0c48c4Sopenharmony_ci } 366da0c48c4Sopenharmony_ci 367da0c48c4Sopenharmony_ci /* Are all our strings there? */ 368da0c48c4Sopenharmony_ci check_strings (elf, ndx, "all together now"); 369da0c48c4Sopenharmony_ci 370da0c48c4Sopenharmony_ci if (elf_end (elf) != 0) 371da0c48c4Sopenharmony_ci { 372da0c48c4Sopenharmony_ci printf ("failure in elf_end: %s\n", elf_errmsg (-1)); 373da0c48c4Sopenharmony_ci exit (1); 374da0c48c4Sopenharmony_ci } 375da0c48c4Sopenharmony_ci 376da0c48c4Sopenharmony_ci close (fd); 377da0c48c4Sopenharmony_ci 378da0c48c4Sopenharmony_ci unlink (fname); 379da0c48c4Sopenharmony_ci} 380da0c48c4Sopenharmony_ci 381da0c48c4Sopenharmony_ciint 382da0c48c4Sopenharmony_cimain (int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) 383da0c48c4Sopenharmony_ci{ 384da0c48c4Sopenharmony_ci elf_version (EV_CURRENT); 385da0c48c4Sopenharmony_ci 386da0c48c4Sopenharmony_ci // Fill holes with something non-zero to more easily spot 387da0c48c4Sopenharmony_ci // unterminated strings. 388da0c48c4Sopenharmony_ci elf_fill ('X'); 389da0c48c4Sopenharmony_ci 390da0c48c4Sopenharmony_ci check_elf ("strtab.elf.32", ELFCLASS32, 0); 391da0c48c4Sopenharmony_ci check_elf ("strtab.elf.32.mmap", ELFCLASS32, 1); 392da0c48c4Sopenharmony_ci check_elf ("strtab.elf.64", ELFCLASS64, 0); 393da0c48c4Sopenharmony_ci check_elf ("strtab.elf.64.mmap", ELFCLASS64, 1); 394da0c48c4Sopenharmony_ci 395da0c48c4Sopenharmony_ci return 0; 396da0c48c4Sopenharmony_ci} 397da0c48c4Sopenharmony_ci 398