resetting manifest requested domain to floor
[platform/upstream/chrpath.git] / killrpath.c
1 /*
2 Taken from another list:
3
4 _Changing_ is a little tricky, but the attached program strips rpaths
5 from executables (I find it essential for debugging the binutils).
6 It's endian-dependent, if you want this for x86 you can just change
7 the occurrences of 'MSB' to 'LSB' and compile (I should really fix
8 that).
9
10 --
11 Geoffrey Keating <geoffk@ozemail.com.au>
12 */
13
14 #ifdef HAVE_CONFIG_H
15 #  include "config.h"
16 #endif
17
18 #include <stdio.h>
19 #include <unistd.h>
20 #include <fcntl.h>
21 #include <elf.h>
22 #if defined(HAVE_LINK_H)
23 #  include <link.h>
24 #endif /* HAVE_LINK_H */
25 #include <stdlib.h>
26 #include "protos.h"
27 #include <string.h>
28
29 /* Reads an ELF file, nukes all the RPATH entries. */
30
31 int
32 killrpath(const char *filename)
33 {
34    int fd;
35    Elf_Ehdr ehdr;
36    int i;
37    Elf_Phdr phdr;
38    Elf_Dyn *dyns;
39    int dynpos;
40
41    fd = elf_open(filename, O_RDWR, &ehdr);
42
43    if (fd == -1)
44    {
45      perror ("elf_open");
46      return 1;
47    }
48
49    if (0 != elf_find_dynamic_section(fd, &ehdr, &phdr))
50    {
51      perror("found no dynamic section");
52      return 1;
53    }
54
55    dyns = malloc(phdr.p_memsz);
56    if (dyns == NULL)
57      {
58        perror ("allocating memory for dynamic section");
59        return 1;
60      }
61    memset(dyns, 0, phdr.p_memsz);
62    if (lseek(fd, phdr.p_offset, SEEK_SET) == -1
63        || read(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz)
64      {
65        perror ("reading dynamic section");
66        return 1;
67      }
68
69    dynpos = 0;
70    for (i = 0; dyns[i].d_tag != DT_NULL; i++)
71      {
72        dyns[dynpos] = dyns[i];
73        if ( ! elf_dynpath_tag(dyns[i].d_tag) )
74         dynpos++;
75      }
76    for (; dynpos < i; dynpos++)
77      dyns[dynpos].d_tag = DT_NULL;
78
79    if (lseek(fd, phdr.p_offset, SEEK_SET) == -1
80        || write(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz)
81      {
82        perror ("writing dynamic section");
83        return 1;
84      }
85
86    elf_close(fd);
87
88    return 0;
89 }