Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/ldd/ldd.c
Show First 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | |||||
#define TYPE_UNKNOWN 0 | #define TYPE_UNKNOWN 0 | ||||
#define TYPE_ELF 1 /* Architecture default */ | #define TYPE_ELF 1 /* Architecture default */ | ||||
#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) | #if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) | ||||
#define TYPE_ELF32 2 /* Explicit 32 bits on architectures >32 bits */ | #define TYPE_ELF32 2 /* Explicit 32 bits on architectures >32 bits */ | ||||
#define _PATH_LDD32 "/usr/bin/ldd32" | #define _PATH_LDD32 "/usr/bin/ldd32" | ||||
static int | static int | ||||
execldd32(char *file, char *fmt1, char *fmt2, int aflag, int vflag) | execldd32(char *file, char *fmt1, char *fmt2, int aflag) | ||||
{ | { | ||||
char *argv[9]; | char *argv[9]; | ||||
int i, rval, status; | int i, rval, status; | ||||
LDD_UNSETENV("TRACE_LOADED_OBJECTS"); | LDD_UNSETENV("TRACE_LOADED_OBJECTS"); | ||||
rval = 0; | rval = 0; | ||||
i = 0; | i = 0; | ||||
argv[i++] = strdup(_PATH_LDD32); | argv[i++] = strdup(_PATH_LDD32); | ||||
if (aflag) | if (aflag) | ||||
argv[i++] = strdup("-a"); | argv[i++] = strdup("-a"); | ||||
if (vflag) | |||||
argv[i++] = strdup("-v"); | |||||
if (fmt1 != NULL) { | if (fmt1 != NULL) { | ||||
argv[i++] = strdup("-f"); | argv[i++] = strdup("-f"); | ||||
argv[i++] = strdup(fmt1); | argv[i++] = strdup(fmt1); | ||||
} | } | ||||
if (fmt2 != NULL) { | if (fmt2 != NULL) { | ||||
argv[i++] = strdup("-f"); | argv[i++] = strdup("-f"); | ||||
argv[i++] = strdup(fmt2); | argv[i++] = strdup(fmt2); | ||||
} | } | ||||
Show All 24 Lines | execldd32(char *file, char *fmt1, char *fmt2, int aflag) | ||||
return (rval); | return (rval); | ||||
} | } | ||||
#endif | #endif | ||||
int | int | ||||
main(int argc, char *argv[]) | main(int argc, char *argv[]) | ||||
{ | { | ||||
char *fmt1, *fmt2; | char *fmt1, *fmt2; | ||||
int rval, c, aflag, vflag; | int rval, c, aflag; | ||||
aflag = vflag = 0; | aflag = 0; | ||||
fmt1 = fmt2 = NULL; | fmt1 = fmt2 = NULL; | ||||
while ((c = getopt(argc, argv, "af:v")) != -1) { | while ((c = getopt(argc, argv, "af:")) != -1) { | ||||
switch (c) { | switch (c) { | ||||
case 'a': | case 'a': | ||||
aflag++; | aflag++; | ||||
break; | break; | ||||
case 'f': | case 'f': | ||||
if (fmt1 != NULL) { | if (fmt1 != NULL) { | ||||
if (fmt2 != NULL) | if (fmt2 != NULL) | ||||
errx(1, "too many formats"); | errx(1, "too many formats"); | ||||
fmt2 = optarg; | fmt2 = optarg; | ||||
} else | } else | ||||
fmt1 = optarg; | fmt1 = optarg; | ||||
break; | break; | ||||
case 'v': | |||||
vflag++; | |||||
break; | |||||
default: | default: | ||||
usage(); | usage(); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
} | } | ||||
} | } | ||||
argc -= optind; | argc -= optind; | ||||
argv += optind; | argv += optind; | ||||
if (vflag && fmt1 != NULL) | |||||
errx(1, "-v may not be used with -f"); | |||||
if (argc <= 0) { | if (argc <= 0) { | ||||
usage(); | usage(); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
} | } | ||||
rval = 0; | rval = 0; | ||||
for (; argc > 0; argc--, argv++) { | for (; argc > 0; argc--, argv++) { | ||||
int fd, status, is_shlib, rv, type; | int fd, status, is_shlib, rv, type; | ||||
Show All 10 Lines | if (rv == 0) { | ||||
continue; | continue; | ||||
} | } | ||||
switch (type) { | switch (type) { | ||||
case TYPE_ELF: | case TYPE_ELF: | ||||
break; | break; | ||||
#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) | #if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) | ||||
case TYPE_ELF32: | case TYPE_ELF32: | ||||
rval |= execldd32(*argv, fmt1, fmt2, aflag, vflag); | rval |= execldd32(*argv, fmt1, fmt2, aflag); | ||||
continue; | continue; | ||||
#endif | #endif | ||||
case TYPE_UNKNOWN: | case TYPE_UNKNOWN: | ||||
default: | default: | ||||
/* | /* | ||||
* This shouldn't happen unless is_executable() | * This shouldn't happen unless is_executable() | ||||
* is broken. | * is broken. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | #endif | ||||
return rval; | return rval; | ||||
} | } | ||||
static void | static void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
fprintf(stderr, "usage: ldd [-a] [-v] [-f format] program ...\n"); | fprintf(stderr, "usage: ldd [-a] [-f format] program ...\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
static bool | static bool | ||||
has_freebsd_abi_tag(const char *fname, Elf *elf, GElf_Ehdr *ehdr, off_t offset, | has_freebsd_abi_tag(const char *fname, Elf *elf, GElf_Ehdr *ehdr, off_t offset, | ||||
size_t len) | size_t len) | ||||
{ | { | ||||
Elf_Data dst, src; | Elf_Data dst, src; | ||||
▲ Show 20 Lines • Show All 202 Lines • Show Last 20 Lines |