comparison killrpath.c @ 1:bbbfb3f97919

implement 32 and 64 bit support
author Peter Meerwald <p.meerwald@bct-electronic.com>
date Fri, 20 Jul 2012 11:26:24 +0200
parents b8f7423e385c
children
comparison
equal deleted inserted replaced
0:b8f7423e385c 1:bbbfb3f97919
24 #endif /* HAVE_LINK_H */ 24 #endif /* HAVE_LINK_H */
25 #include <stdlib.h> 25 #include <stdlib.h>
26 #include "protos.h" 26 #include "protos.h"
27 #include <string.h> 27 #include <string.h>
28 28
29 /* Reads an ELF file, nukes all the RPATH entries. */ 29 static int
30 30 killrpath32(int fd, Elf32_Ehdr *ehdr) {
31 int
32 killrpath(const char *filename)
33 {
34 int fd;
35 Elf_Ehdr ehdr;
36 int i; 31 int i;
37 Elf_Phdr phdr; 32 Elf32_Phdr phdr;
38 Elf_Dyn *dyns; 33 Elf32_Dyn *dyns;
39 int dynpos; 34 int dynpos;
40 35
41 fd = elf_open(filename, O_RDWR, &ehdr); 36 if (0 != elf32_find_dynamic_section(fd, ehdr, &phdr))
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 { 37 {
51 perror("found no dynamic section"); 38 perror("found no dynamic section");
52 return 1; 39 return 1;
53 } 40 }
54 41
85 72
86 elf_close(fd); 73 elf_close(fd);
87 74
88 return 0; 75 return 0;
89 } 76 }
77
78 static int
79 killrpath64(int fd, Elf64_Ehdr *ehdr) {
80 int i;
81 Elf64_Phdr phdr;
82 Elf64_Dyn *dyns;
83 int dynpos;
84
85 if (0 != elf64_find_dynamic_section(fd, ehdr, &phdr))
86 {
87 perror("found no dynamic section");
88 return 1;
89 }
90
91 dyns = malloc(phdr.p_memsz);
92 if (dyns == NULL)
93 {
94 perror ("allocating memory for dynamic section");
95 return 1;
96 }
97 memset(dyns, 0, phdr.p_memsz);
98 if (lseek(fd, phdr.p_offset, SEEK_SET) == -1
99 || read(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz)
100 {
101 perror ("reading dynamic section");
102 return 1;
103 }
104
105 dynpos = 0;
106 for (i = 0; dyns[i].d_tag != DT_NULL; i++)
107 {
108 dyns[dynpos] = dyns[i];
109 if ( ! elf_dynpath_tag(dyns[i].d_tag) )
110 dynpos++;
111 }
112 for (; dynpos < i; dynpos++)
113 dyns[dynpos].d_tag = DT_NULL;
114
115 if (lseek(fd, phdr.p_offset, SEEK_SET) == -1
116 || write(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz)
117 {
118 perror ("writing dynamic section");
119 return 1;
120 }
121
122 elf_close(fd);
123
124 return 0;
125 }
126
127 /* Reads an ELF file, nukes all the RPATH entries. */
128
129 int
130 killrpath(const char *filename)
131 {
132 int fd;
133 Elf32_Ehdr ehdr32;
134 Elf64_Ehdr ehdr64;
135
136 fd = elf32_open(filename, O_RDWR, &ehdr32);
137 if (fd >= 0)
138 {
139 return killrpath32(fd, &ehdr32);
140 }
141
142 fd = elf64_open(filename, O_RDWR, &ehdr64);
143 if (fd >= 0)
144 {
145 return killrpath64(fd, &ehdr64);
146 }
147
148 perror ("elf_open");
149 return 1;
150 }

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.