1 #define _POSIX_C_SOURCE 200112L
12 #define RELOCATABLE 0x1
13 #define EXECUTABLE 0x2
18 int readline(FILE *f, char *fn);
19 int checkfile(char *fn, unsigned int want, int perr);
24 int main(int ac, char **av) {
26 unsigned int want = 0;
34 while ((option = getopt(ac, av, "vtnredclap0f:")) != -1) {
36 case 'r': want |= RELOCATABLE; break;
37 case 'e': want |= EXECUTABLE; break;
38 case 'd': want |= DYNAMIC; break;
39 case 'c': want |= CORE; break;
40 case 'l': want |= SYMLINKS; break;
41 case 'a': want = (RELOCATABLE|EXECUTABLE|DYNAMIC|CORE); break;
42 case 't': printtype++; break;
43 case 'n': printname++; break;
44 case 'v': verbose++; break;
45 case 'p': perr++; break;
46 case '0': zeroterm = 1; break;
48 if (optarg[0] == '-' && optarg[1] == 0) {
51 list = fopen(optarg, "r");
60 if (!want) want = (RELOCATABLE|EXECUTABLE|DYNAMIC|CORE);
65 while (readline(list, fn)) {
66 if ((type = checkfile(fn, want, perr)) & want) {
70 printf("relocatable "); break;
72 printf("executable "); break;
74 printf("dynamic "); break;
76 printf("core "); break;
78 printf("notelf "); break;
89 if (verbose) fprintf(stderr, "checking %s\n", av[optind]);
90 type = checkfile(fn,want,perr);
95 printf("relocatable"); break;
97 printf("executable"); break;
99 printf("dynamic"); break;
101 printf("core"); break;
103 printf("notelf"); break;
108 printf("%s%s", printtype ? " " : "", fn);
110 if (printtype || printname) printf("\n");
112 return type & want ? 0 : 1;
114 return errors ? 1 : 0;
117 int readline(FILE *f, char *fn) {
126 if (i == 0) continue;
130 if (i == 0) continue;
138 /* TODO print an error */
147 int checkfile(char *fn, unsigned int want, int perr) {
153 if (want & SYMLINKS) {
158 if (!S_ISREG(st.st_mode)) {
162 fd = open(fn, O_RDONLY);
168 bytes = read(fd, &hdr, sizeof hdr);
170 if ((size_t)bytes < sizeof hdr) {
171 if (perr) fprintf(stderr, "could not read full elf header (wanted %zu got %d bytes)\n", sizeof hdr, bytes);
174 if (hdr.e_ident[EI_MAG0] != ELFMAG0
175 || hdr.e_ident[EI_MAG1] != ELFMAG1
176 || hdr.e_ident[EI_MAG2] != ELFMAG2
177 || hdr.e_ident[EI_MAG3] != ELFMAG3
179 if (perr) fprintf(stderr, "elf header magic wrong\n");
182 switch (hdr.e_ident[EI_CLASS]) {
188 if (perr) fprintf(stderr, "elf header unknown class\n");
192 endian = hdr.e_ident[EI_DATA];
194 case ELFDATA2LSB: break;
195 case ELFDATA2MSB: break;
196 /* TODO swap endian if needed */
198 if (perr) fprintf(stderr, "elf header unknown endian\n");
202 switch (hdr.e_type) {
203 case ET_REL: return RELOCATABLE;
204 case ET_EXEC: return EXECUTABLE;
205 case ET_DYN: return DYNAMIC;
206 case ET_CORE: return CORE;
209 if (perr) fprintf(stderr, "unknown %s\n", fn);