#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <elf.h>
+
+#include "elf.h"
int main(int ac, char **av) {
void *elfbase;
char *name, *dynname;
Elf64_Dyn *dent;
+ if (ac < 2) {
+ fprintf(stderr, "usage: soname <file>\n");
+ exit(EXIT_FAILURE);
+ }
+
if (lstat(av[1], &sbuf) == -1) {
exit(1);
}
if (fstat(elffd, &sbuf) == -1) {
exit(1);
}
+ /* not a regular file? */
if (!S_ISREG(sbuf.st_mode)) {
exit(1);
}
+ /* not at least the size of the elf header? */
+ if ((size_t)sbuf.st_size < sizeof(Elf64_Ehdr)) {
+ exit(1);
+ }
elfbase = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, elffd, 0);
if (!elfbase) {
for (dent = (Elf64_Dyn *)((char *)elfbase + dynsect->sh_offset); dent->d_tag != DT_NULL; dent++) {
if (dent->d_tag == DT_SONAME) {
printf("%s\n", dynname + dent->d_un.d_val);
- break;
+ /* TODO can there be more than one? */
+ exit(0);
}
}
- return 0;
+ return 11;
}