return res;
}
-int bcc_elf_is_shared_obj(const char *path) {
+int bcc_elf_get_type(const char *path) {
Elf *e;
GElf_Ehdr hdr;
- int fd, res = -1;
+ int fd;
+ void* res = NULL;
if (openelf(path, &e, &fd) < 0)
return -1;
- if (gelf_getehdr(e, &hdr))
- res = (hdr.e_type == ET_DYN);
-
+ res = (void*)gelf_getehdr(e, &hdr);
elf_end(e);
close(fd);
- return res;
+ if (!res)
+ return -1;
+ else
+ return hdr.e_type;
+}
+
+int bcc_elf_is_exe(const char *path) {
+ return (bcc_elf_get_type(path) != -1) && (access(path, X_OK) == 0);
+}
+
+int bcc_elf_is_shared_obj(const char *path) {
+ return bcc_elf_get_type(path) == ET_DYN;
}
#if 0
int bcc_elf_loadaddr(const char *path, uint64_t *address);
int bcc_elf_foreach_sym(const char *path, bcc_elf_symcb callback,
void *payload);
+
+int bcc_elf_get_type(const char *path);
int bcc_elf_is_shared_obj(const char *path);
+int bcc_elf_is_exe(const char *path);
#ifdef __cplusplus
}
#include "bcc_proc.h"
#include "bcc_elf.h"
-static bool is_exe(const char *path) {
- struct stat s;
- if (access(path, X_OK) < 0)
- return false;
-
- if (stat(path, &s) < 0)
- return false;
-
- return S_ISREG(s.st_mode);
-}
-
char *bcc_procutils_which(const char *binpath) {
char buffer[4096];
const char *PATH;
if (strchr(binpath, '/'))
- return is_exe(binpath) ? strdup(binpath) : 0;
+ return bcc_elf_is_exe(binpath) ? strdup(binpath) : 0;
if (!(PATH = getenv("PATH")))
return 0;
buffer[path_len] = '/';
strcpy(buffer + path_len + 1, binpath);
- if (is_exe(buffer))
+ if (bcc_elf_is_exe(buffer))
return strdup(buffer);
}
bool Probe::in_shared_object() {
if (!in_shared_object_)
- in_shared_object_ = (bcc_elf_is_shared_obj(bin_path_.c_str()) == 1);
+ in_shared_object_ = bcc_elf_is_shared_obj(bin_path_.c_str());
return in_shared_object_.value();
}
.resolve_name(binpath.c_str(), deref_ident_->c_str(), address);
}
- if (bcc_elf_is_shared_obj(binpath.c_str()) == 0) {
+ if (!bcc_elf_is_shared_obj(binpath.c_str())) {
struct bcc_symbol sym = {deref_ident_->c_str(), binpath.c_str(), 0x0};
if (!bcc_find_symbol_addr(&sym) && sym.offset) {
*address = sym.offset;