Commit acd86d94 authored by David 'Digit' Turner's avatar David 'Digit' Turner Committed by Commit Bot

android crazy linker: Simplify logging macros.

Simplifies logging by always appending the current location
(i.e. function name) when LOG() or LOG_ERRNO() are called.

This makes client code smaller and easier to write / read at
the same time.

BUG=NONE
R=pasko@chromium.org,agrieve@chromium.org,rmcilroy@chromium.org

Change-Id: I820c2584eee4cd476bda7e6fb99bbd27782858d7
Reviewed-on: https://chromium-review.googlesource.com/891233Reviewed-by: default avataragrieve <agrieve@chromium.org>
Reviewed-by: default avatarRoss McIlroy <rmcilroy@chromium.org>
Commit-Queue: David Turner <digit@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532683}
parent f18e6ccd
...@@ -53,32 +53,27 @@ bool AshmemRegion::CheckFileDescriptorIsReadOnly(int fd) { ...@@ -53,32 +53,27 @@ bool AshmemRegion::CheckFileDescriptorIsReadOnly(int fd) {
// First, check that trying to map a page of the region with PROT_WRITE // First, check that trying to map a page of the region with PROT_WRITE
// fails with EPERM. // fails with EPERM.
if (map.Allocate(NULL, map_size, MemoryMapping::CAN_WRITE, fd)) { if (map.Allocate(NULL, map_size, MemoryMapping::CAN_WRITE, fd)) {
LOG("%s: Region could be mapped writable. Should not happen.\n", LOG("Region could be mapped writable. Should not happen.");
__FUNCTION__);
errno = EPERM; errno = EPERM;
return false; return false;
} }
if (errno != EPERM) { if (errno != EPERM) {
LOG_ERRNO("%s: Region failed writable mapping with unexpected error", LOG_ERRNO("Region failed writable mapping with unexpected error");
__FUNCTION__);
return false; return false;
} }
// Second, check that it can be mapped PROT_READ, but cannot be remapped // Second, check that it can be mapped PROT_READ, but cannot be remapped
// with PROT_READ | PROT_WRITE through mprotect(). // with PROT_READ | PROT_WRITE through mprotect().
if (!map.Allocate(NULL, map_size, MemoryMapping::CAN_READ, fd)) { if (!map.Allocate(NULL, map_size, MemoryMapping::CAN_READ, fd)) {
LOG_ERRNO("%s: Failed to map region read-only", __FUNCTION__); LOG_ERRNO("Failed to map region read-only");
return false; return false;
} }
if (map.SetProtection(MemoryMapping::CAN_READ_WRITE)) { if (map.SetProtection(MemoryMapping::CAN_READ_WRITE)) {
LOG_ERRNO("%s: Region could be remapped read-write. Should not happen.\n", LOG_ERRNO("Region could be remapped read-write. Should not happen.");
__FUNCTION__);
return false; return false;
} }
if (errno != EACCES) { if (errno != EACCES) {
LOG_ERRNO( LOG_ERRNO("Region failed to be remapped read-write with unexpected error");
"%s: Region failed to be remapped read-write with unexpected error",
__FUNCTION__);
return false; return false;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
namespace crazy { namespace crazy {
...@@ -20,47 +21,75 @@ namespace crazy { ...@@ -20,47 +21,75 @@ namespace crazy {
namespace { namespace {
void LogArgs(const char* fmt, va_list args, bool print_error, int error) { struct LogBuffer {
const size_t buffer_size = 4096; LogBuffer() = default;
char* buffer = reinterpret_cast<char*>(::malloc(buffer_size));
int ret; void Append(const char* str) {
int avail = kSize - pos_;
ret = vsnprintf(buffer, buffer_size, fmt, args); int ret = snprintf(buffer_ + pos_, avail, "%s", str);
if (ret >= static_cast<int>(buffer_size)) if (ret >= avail) {
ret = static_cast<int>(buffer_size) - 1; pos_ = kSize - 1;
} else {
pos_ += ret;
}
}
if (print_error) { void AppendV(const char* fmt, va_list args) {
strlcat(buffer, ": ", buffer_size); int avail = kSize - pos_;
strlcat(buffer, strerror(error), buffer_size); int ret = vsnprintf(buffer_ + pos_, kSize - pos_, fmt, args);
if (ret >= avail) {
pos_ = kSize - 1;
} else {
pos_ += ret;
}
} }
// First, send to stderr. void Print() {
fprintf(stderr, "%.*s", ret, buffer); // First, send to stderr.
fprintf(stderr, "%.*s\n", pos_, buffer_);
#ifdef __ANDROID__ #ifdef __ANDROID__
// Then to the Android log. // Then to the Android log.
__android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer); __android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer_);
#endif #endif
}
::free(buffer); private:
} static constexpr int kSize = 4096;
int pos_ = 0;
char buffer_[kSize];
};
} // namespace } // namespace
void Log(const char* fmt, ...) { void Log(const char* location, const char* fmt, ...) {
int old_errno = errno; int old_errno = errno;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
LogArgs(fmt, args, false, -1); {
LogBuffer log;
log.Append(location);
log.Append(": ");
log.AppendV(fmt, args);
log.Print();
}
va_end(args); va_end(args);
errno = old_errno; errno = old_errno;
} }
void LogErrno(const char* fmt, ...) { void LogErrno(const char* location, const char* fmt, ...) {
int old_errno = errno; int old_errno = errno;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
LogArgs(fmt, args, true, old_errno); {
LogBuffer log;
log.Append(location);
log.Append(": ");
log.AppendV(fmt, args);
log.Append(": ");
log.Append(strerror(old_errno));
log.Print();
}
va_end(args); va_end(args);
errno = old_errno; errno = old_errno;
} }
......
...@@ -31,11 +31,11 @@ namespace crazy { ...@@ -31,11 +31,11 @@ namespace crazy {
#if CRAZY_DEBUG #if CRAZY_DEBUG
void Log(const char* fmt, ...); void Log(const char* location, const char* fmt, ...);
void LogErrno(const char* fmt, ...); void LogErrno(const char* location, const char* fmt, ...);
#define LOG(...) ::crazy::Log(__VA_ARGS__) #define LOG(...) ::crazy::Log(__PRETTY_FUNCTION__, __VA_ARGS__)
#define LOG_ERRNO(...) ::crazy::LogErrno(__VA_ARGS__) #define LOG_ERRNO(...) ::crazy::LogErrno(__PRETTY_FUNCTION__, __VA_ARGS__)
#else #else
......
...@@ -76,11 +76,7 @@ bool ElfLoader::LoadAt(const char* lib_path, ...@@ -76,11 +76,7 @@ bool ElfLoader::LoadAt(const char* lib_path,
off_t file_offset, off_t file_offset,
uintptr_t wanted_address, uintptr_t wanted_address,
Error* error) { Error* error) {
LOG("lib_path='%s', file_offset=%p, load_address=%p", lib_path, file_offset,
LOG("%s: lib_path='%s', file_offset=%p, load_address=%p\n",
__FUNCTION__,
lib_path,
file_offset,
wanted_address); wanted_address);
// Check that the load address is properly page-aligned. // Check that the load address is properly page-aligned.
...@@ -243,11 +239,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) { ...@@ -243,11 +239,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
if (wanted_load_address_) { if (wanted_load_address_) {
addr -= min_vaddr; addr -= min_vaddr;
} }
LOG("%s: added %d to size, for Breakpad guard\n", __FUNCTION__, min_vaddr); LOG("added %d to size, for Breakpad guard", min_vaddr);
} }
#endif #endif
LOG("%s: address=%p size=%p\n", __FUNCTION__, addr, reserved_size_); LOG("address=%p size=%p", addr, reserved_size_);
void* start = mmap(addr, reserved_size_, PROT_NONE, mmap_flags, -1, 0); void* start = mmap(addr, reserved_size_, PROT_NONE, mmap_flags, -1, 0);
if (start == MAP_FAILED) { if (start == MAP_FAILED) {
error->Format("Could not reserve %d bytes of address space", error->Format("Could not reserve %d bytes of address space",
...@@ -261,7 +257,7 @@ bool ElfLoader::ReserveAddressSpace(Error* error) { ...@@ -261,7 +257,7 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
} }
reserved_start_ = start; reserved_start_ = start;
LOG("%s: reserved start=%p\n", __FUNCTION__, reserved_start_); LOG("reserved start=%p", reserved_start_);
load_start_ = start; load_start_ = start;
load_bias_ = reinterpret_cast<ELF::Addr>(start) - min_vaddr; load_bias_ = reinterpret_cast<ELF::Addr>(start) - min_vaddr;
...@@ -276,11 +272,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) { ...@@ -276,11 +272,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
load_start_ = reinterpret_cast<void*>( load_start_ = reinterpret_cast<void*>(
reinterpret_cast<uintptr_t>(load_start_) + min_vaddr); reinterpret_cast<uintptr_t>(load_start_) + min_vaddr);
load_bias_ += min_vaddr; load_bias_ += min_vaddr;
LOG("%s: moved map by %d, for Breakpad guard\n", __FUNCTION__, min_vaddr); LOG("moved map by %d, for Breakpad guard", min_vaddr);
} }
#endif #endif
LOG("%s: load start=%p, bias=%p\n", __FUNCTION__, load_start_, load_bias_); LOG("load start=%p, bias=%p", load_start_, load_bias_);
return true; return true;
} }
...@@ -364,11 +360,8 @@ bool ElfLoader::LoadSegments(Error* error) { ...@@ -364,11 +360,8 @@ bool ElfLoader::LoadSegments(Error* error) {
ELF::Addr file_page_start = PAGE_START(file_start); ELF::Addr file_page_start = PAGE_START(file_start);
ELF::Addr file_length = file_end - file_page_start; ELF::Addr file_length = file_end - file_page_start;
LOG("%s: file_offset=%p file_length=%p start_address=%p end_address=%p\n", LOG("file_offset=%p file_length=%p start_address=%p end_address=%p",
__FUNCTION__, file_offset_ + file_page_start, file_length, seg_page_start,
file_offset_ + file_page_start,
file_length,
seg_page_start,
seg_page_start + PAGE_END(file_length)); seg_page_start + PAGE_END(file_length));
if (file_length != 0) { if (file_length != 0) {
......
...@@ -330,7 +330,7 @@ bool ElfRelocations::Init(const ElfView* view, Error* error) { ...@@ -330,7 +330,7 @@ bool ElfRelocations::Init(const ElfView* view, Error* error) {
bool ElfRelocations::ApplyAll(const ElfSymbols* symbols, bool ElfRelocations::ApplyAll(const ElfSymbols* symbols,
SymbolResolver* resolver, SymbolResolver* resolver,
Error* error) { Error* error) {
LOG("%s: Enter\n", __FUNCTION__); LOG("Enter");
if (has_text_relocations_) { if (has_text_relocations_) {
if (phdr_table_unprotect_segments(phdr_, phdr_count_, load_bias_) < 0) { if (phdr_table_unprotect_segments(phdr_, phdr_count_, load_bias_) < 0) {
...@@ -362,7 +362,7 @@ bool ElfRelocations::ApplyAll(const ElfSymbols* symbols, ...@@ -362,7 +362,7 @@ bool ElfRelocations::ApplyAll(const ElfSymbols* symbols,
} }
} }
LOG("%s: Done\n", __FUNCTION__); LOG("Done");
return true; return true;
} }
...@@ -405,20 +405,18 @@ bool ElfRelocations::ForEachAndroidRelocationHelper( ...@@ -405,20 +405,18 @@ bool ElfRelocations::ForEachAndroidRelocationHelper(
while (rel_iterator.has_next()) { while (rel_iterator.has_next()) {
const auto rel = rel_iterator.next(); const auto rel = rel_iterator.next();
if (rel == nullptr) { if (rel == nullptr) {
LOG("%s: failed to parse relocation %d\n", __FUNCTION__, LOG("failed to parse relocation %d", relocations_handled);
relocations_handled);
return false; return false;
} }
// Pass the relocation to the supplied handler function. If the handler // Pass the relocation to the supplied handler function. If the handler
// returns false we view this as failure and return false to our caller. // returns false we view this as failure and return false to our caller.
if (!handler(this, rel, opaque)) { if (!handler(this, rel, opaque)) {
LOG("%s: failed handling relocation %d\n", __FUNCTION__, LOG("failed handling relocation %d", relocations_handled);
relocations_handled);
return false; return false;
} }
relocations_handled++; relocations_handled++;
} }
LOG("%s: relocations_handled=%d\n", __FUNCTION__, relocations_handled); LOG("relocations_handled=%d", relocations_handled);
return true; return true;
} }
...@@ -706,7 +704,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type, ...@@ -706,7 +704,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type,
if (address) { if (address) {
// The symbol was found, so compute its address. // The symbol was found, so compute its address.
RLOG("%s: symbol %s resolved to %p\n", __FUNCTION__, sym_name, address); RLOG("symbol %s resolved to %p", sym_name, address);
*sym_addr = reinterpret_cast<ELF::Addr>(address); *sym_addr = reinterpret_cast<ELF::Addr>(address);
return true; return true;
} }
...@@ -718,7 +716,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type, ...@@ -718,7 +716,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type,
return false; return false;
} }
RLOG("%s: weak reference to unresolved symbol %s\n", __FUNCTION__, sym_name); RLOG("weak reference to unresolved symbol %s", sym_name);
// IHI0044C AAELF 4.5.1.1: // IHI0044C AAELF 4.5.1.1:
// Libraries are not searched to resolve weak references. // Libraries are not searched to resolve weak references.
...@@ -787,7 +785,7 @@ bool ElfRelocations::ApplyRelocs(const rel_t* rel, ...@@ -787,7 +785,7 @@ bool ElfRelocations::ApplyRelocs(const rel_t* rel,
const ElfSymbols* symbols, const ElfSymbols* symbols,
SymbolResolver* resolver, SymbolResolver* resolver,
Error* error) { Error* error) {
RLOG("%s: rel=%p rel_count=%d\n", __FUNCTION__, rel, rel_count); RLOG("rel=%p rel_count=%d", rel, rel_count);
if (!rel) if (!rel)
return true; return true;
......
...@@ -156,26 +156,23 @@ bool SharedRelro::InitFrom(size_t relro_start, ...@@ -156,26 +156,23 @@ bool SharedRelro::InitFrom(size_t relro_start,
// Create temporary mapping of the ashmem region. // Create temporary mapping of the ashmem region.
ScopedMemoryMapping fd_map; ScopedMemoryMapping fd_map;
LOG("%s: Entering addr=%p size=%p fd=%d\n", LOG("Entering addr=%p size=%p fd=%d", (void*)relro_start, (void*)relro_size,
__FUNCTION__,
(void*)relro_start,
(void*)relro_size,
ashmem_fd); ashmem_fd);
// Sanity check: Ashmem file descriptor must be read-only. // Sanity check: Ashmem file descriptor must be read-only.
if (!AshmemRegion::CheckFileDescriptorIsReadOnly(ashmem_fd)) { if (!AshmemRegion::CheckFileDescriptorIsReadOnly(ashmem_fd)) {
error->Format("Ashmem file descriptor is not read-only: %s\n", error->Format("Ashmem file descriptor is not read-only: %s",
strerror(errno)); strerror(errno));
return false; return false;
} }
if (!fd_map.Allocate(NULL, relro_size, MemoryMapping::CAN_READ, ashmem_fd)) { if (!fd_map.Allocate(NULL, relro_size, MemoryMapping::CAN_READ, ashmem_fd)) {
error->Format("Cannot map RELRO ashmem region as read-only: %s\n", error->Format("Cannot map RELRO ashmem region as read-only: %s",
strerror(errno)); strerror(errno));
return false; return false;
} }
LOG("%s: mapping allocated at %p\n", __FUNCTION__, fd_map.Get()); LOG("mapping allocated at %p", fd_map.Get());
char* cur_page = reinterpret_cast<char*>(relro_start); char* cur_page = reinterpret_cast<char*>(relro_start);
char* fd_page = static_cast<char*>(fd_map.Get()); char* fd_page = static_cast<char*>(fd_map.Get());
...@@ -197,10 +194,7 @@ bool SharedRelro::InitFrom(size_t relro_start, ...@@ -197,10 +194,7 @@ bool SharedRelro::InitFrom(size_t relro_start,
if (p2 > p) { if (p2 > p) {
// Swap pages between |pos| and |pos2|. // Swap pages between |pos| and |pos2|.
LOG("%s: Swap pages at %p-%p\n", LOG("Swap pages at %p-%p", cur_page + p, cur_page + p2);
__FUNCTION__,
cur_page + p,
cur_page + p2);
if (!SwapPagesFromFd(cur_page + p, p2 - p, ashmem_fd, p, error)) if (!SwapPagesFromFd(cur_page + p, p2 - p, ashmem_fd, p, error))
return false; return false;
...@@ -210,11 +204,8 @@ bool SharedRelro::InitFrom(size_t relro_start, ...@@ -210,11 +204,8 @@ bool SharedRelro::InitFrom(size_t relro_start,
p = p2; p = p2;
} while (p < size); } while (p < size);
LOG("%s: Swapped %d pages over %d (%d %%, %d KB not shared)\n", LOG("Swapped %d pages over %d (%d %%, %d KB not shared)",
__FUNCTION__, similar_size / PAGE_SIZE, size / PAGE_SIZE, similar_size * 100 / size,
similar_size / PAGE_SIZE,
size / PAGE_SIZE,
similar_size * 100 / size,
(size - similar_size) / 4096); (size - similar_size) / 4096);
if (similar_size == 0) { if (similar_size == 0) {
......
...@@ -27,13 +27,13 @@ unsigned ElfHash(const char* name) { ...@@ -27,13 +27,13 @@ unsigned ElfHash(const char* name) {
} // namespace } // namespace
bool ElfSymbols::Init(const ElfView* view) { bool ElfSymbols::Init(const ElfView* view) {
LOG("%s: Parsing dynamic table\n", __FUNCTION__); LOG("Parsing dynamic table");
ElfView::DynamicIterator dyn(view); ElfView::DynamicIterator dyn(view);
for (; dyn.HasNext(); dyn.GetNext()) { for (; dyn.HasNext(); dyn.GetNext()) {
uintptr_t dyn_addr = dyn.GetAddress(view->load_bias()); uintptr_t dyn_addr = dyn.GetAddress(view->load_bias());
switch (dyn.GetTag()) { switch (dyn.GetTag()) {
case DT_HASH: case DT_HASH:
LOG(" DT_HASH addr=%p\n", dyn_addr); LOG(" DT_HASH addr=%p", dyn_addr);
{ {
ELF::Word* data = reinterpret_cast<ELF::Word*>(dyn_addr); ELF::Word* data = reinterpret_cast<ELF::Word*>(dyn_addr);
hash_bucket_size_ = data[0]; hash_bucket_size_ = data[0];
...@@ -43,11 +43,11 @@ bool ElfSymbols::Init(const ElfView* view) { ...@@ -43,11 +43,11 @@ bool ElfSymbols::Init(const ElfView* view) {
} }
break; break;
case DT_STRTAB: case DT_STRTAB:
LOG(" DT_STRTAB addr=%p\n", dyn_addr); LOG(" DT_STRTAB addr=%p", dyn_addr);
string_table_ = reinterpret_cast<const char*>(dyn_addr); string_table_ = reinterpret_cast<const char*>(dyn_addr);
break; break;
case DT_SYMTAB: case DT_SYMTAB:
LOG(" DT_SYMTAB addr=%p\n", dyn_addr); LOG(" DT_SYMTAB addr=%p", dyn_addr);
symbol_table_ = reinterpret_cast<const ELF::Sym*>(dyn_addr); symbol_table_ = reinterpret_cast<const ELF::Sym*>(dyn_addr);
break; break;
default: default:
......
...@@ -98,22 +98,15 @@ bool ElfView::InitUnmapped(ELF::Addr load_address, ...@@ -98,22 +98,15 @@ bool ElfView::InitUnmapped(ELF::Addr load_address,
phdr_ = phdr0; phdr_ = phdr0;
phdr_count_ = phdr_count; phdr_count_ = phdr_count;
LOG("%s: New ELF view [load_address:%p, load_size:%p, load_bias:%p, phdr:%p, " LOG("New ELF view [load_address:%p, load_size:%p, load_bias:%p, phdr:%p, "
"phdr_count:%d, dynamic:%p, dynamic_count:%d, dynamic_flags:%d\n", "phdr_count:%d, dynamic:%p, dynamic_count:%d, dynamic_flags:%d",
__FUNCTION__, load_address_, load_size_, load_bias_, phdr_, phdr_count_, dynamic_,
load_address_, dynamic_count_, dynamic_flags_);
load_size_,
load_bias_,
phdr_,
phdr_count_,
dynamic_,
dynamic_count_,
dynamic_flags_);
return true; return true;
} }
bool ElfView::ProtectRelroSection(Error* error) { bool ElfView::ProtectRelroSection(Error* error) {
LOG("%s: Enabling GNU RELRO protection\n", __FUNCTION__); LOG("Enabling GNU RELRO protection");
if (phdr_table_protect_gnu_relro(phdr_, phdr_count_, load_bias_) < 0) { if (phdr_table_protect_gnu_relro(phdr_, phdr_count_, load_bias_) < 0) {
error->Format("Can't enable GNU RELRO protection: %s", strerror(errno)); error->Format("Can't enable GNU RELRO protection: %s", strerror(errno));
......
...@@ -17,7 +17,7 @@ void Error::Set(const char* message) { ...@@ -17,7 +17,7 @@ void Error::Set(const char* message) {
message = ""; message = "";
strlcpy(buff_, message, sizeof(buff_)); strlcpy(buff_, message, sizeof(buff_));
LOG("--- ERROR: %s\n", buff_); LOG("--- ERROR: %s", buff_);
} }
void Error::Append(const char* message) { void Error::Append(const char* message) {
...@@ -25,7 +25,7 @@ void Error::Append(const char* message) { ...@@ -25,7 +25,7 @@ void Error::Append(const char* message) {
return; return;
strlcat(buff_, message, sizeof(buff_)); strlcat(buff_, message, sizeof(buff_));
LOG("--- ERROR: %s\n", buff_); LOG("--- ERROR: %s", buff_);
} }
void Error::Format(const char* fmt, ...) { void Error::Format(const char* fmt, ...) {
...@@ -34,7 +34,7 @@ void Error::Format(const char* fmt, ...) { ...@@ -34,7 +34,7 @@ void Error::Format(const char* fmt, ...) {
vsnprintf(buff_, sizeof(buff_), fmt, args); vsnprintf(buff_, sizeof(buff_), fmt, args);
va_end(args); va_end(args);
LOG("--- ERROR: %s\n", buff_); LOG("--- ERROR: %s", buff_);
} }
void Error::AppendFormat(const char* fmt, ...) { void Error::AppendFormat(const char* fmt, ...) {
...@@ -44,7 +44,7 @@ void Error::AppendFormat(const char* fmt, ...) { ...@@ -44,7 +44,7 @@ void Error::AppendFormat(const char* fmt, ...) {
vsnprintf(buff_ + buff_len, sizeof(buff_) - buff_len, fmt, args); vsnprintf(buff_ + buff_len, sizeof(buff_) - buff_len, fmt, args);
va_end(args); va_end(args);
LOG("--- ERROR: %s\n", buff_); LOG("--- ERROR: %s", buff_);
} }
} // namespace crazy } // namespace crazy
...@@ -105,7 +105,7 @@ void LibraryList::LoadPreloads() { ...@@ -105,7 +105,7 @@ void LibraryList::LoadPreloads() {
SearchPathList search_path_list; SearchPathList search_path_list;
search_path_list.ResetFromEnv("LD_LIBRARY_PATH"); search_path_list.ResetFromEnv("LD_LIBRARY_PATH");
LOG("%s: Preloads list is: %s\n", __FUNCTION__, ld_preload); LOG("Preloads list is: %s", ld_preload);
const char* current = ld_preload; const char* current = ld_preload;
const char* end = ld_preload + strlen(ld_preload); const char* end = ld_preload + strlen(ld_preload);
...@@ -121,10 +121,10 @@ void LibraryList::LoadPreloads() { ...@@ -121,10 +121,10 @@ void LibraryList::LoadPreloads() {
current = item + item_length + 1; current = item + item_length + 1;
String lib_name(item, item_length); String lib_name(item, item_length);
LOG("%s: Attempting to preload %s\n", __FUNCTION__, lib_name.c_str()); LOG("Attempting to preload %s", lib_name.c_str());
if (FindKnownLibrary(lib_name.c_str())) { if (FindKnownLibrary(lib_name.c_str())) {
LOG("%s: already loaded %s: ignoring\n", __FUNCTION__, lib_name.c_str()); LOG("already loaded %s: ignoring", lib_name.c_str());
continue; continue;
} }
...@@ -145,7 +145,7 @@ void LibraryList::LoadPreloads() { ...@@ -145,7 +145,7 @@ void LibraryList::LoadPreloads() {
} }
if (CRAZY_DEBUG) { if (CRAZY_DEBUG) {
LOG("%s: Preloads loaded\n", __FUNCTION__); LOG("Preloads loaded");
for (size_t n = 0; n < preloaded_libraries_.GetCount(); ++n) for (size_t n = 0; n < preloaded_libraries_.GetCount(); ++n)
LOG(" ... %p %s\n", LOG(" ... %p %s\n",
preloaded_libraries_[n], preloaded_libraries_[n]->GetName()); preloaded_libraries_[n], preloaded_libraries_[n]->GetName());
...@@ -263,10 +263,7 @@ int LibraryList::IteratePhdr(PhdrIterationCallback callback, void* data) { ...@@ -263,10 +263,7 @@ int LibraryList::IteratePhdr(PhdrIterationCallback callback, void* data) {
void LibraryList::UnloadLibrary(LibraryView* wrap) { void LibraryList::UnloadLibrary(LibraryView* wrap) {
// Sanity check. // Sanity check.
LOG("%s: for %s (ref_count=%d)\n", LOG("for %s (ref_count=%d)", wrap->GetName(), wrap->ref_count());
__FUNCTION__,
wrap->GetName(),
wrap->ref_count());
if (!wrap->IsSystem() && !wrap->IsCrazy()) if (!wrap->IsSystem() && !wrap->IsCrazy())
return; return;
...@@ -318,7 +315,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -318,7 +315,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
Error* error) { Error* error) {
const char* base_name = GetBaseNamePtr(lib_name); const char* base_name = GetBaseNamePtr(lib_name);
LOG("%s: lib_name='%s'\n", __FUNCTION__, lib_name); LOG("lib_name='%s'", lib_name);
// First check whether a library with the same base name was // First check whether a library with the same base name was
// already loaded. // already loaded.
...@@ -348,7 +345,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -348,7 +345,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
// normally with dlopen() and do not proceed to try and load the library // normally with dlopen() and do not proceed to try and load the library
// crazily. // crazily.
if (is_dependency_or_preload) { if (is_dependency_or_preload) {
LOG("%s: Loading system library '%s'\n", __FUNCTION__, lib_name); LOG("Loading system library '%s'", lib_name);
::dlerror(); ::dlerror();
void* system_lib = dlopen(lib_name, dlopen_mode); void* system_lib = dlopen(lib_name, dlopen_mode);
if (!system_lib) { if (!system_lib) {
...@@ -360,7 +357,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -360,7 +357,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
wrap->SetSystem(system_lib, lib_name); wrap->SetSystem(system_lib, lib_name);
known_libraries_.PushBack(wrap); known_libraries_.PushBack(wrap);
LOG("%s: System library %s loaded at %p\n", __FUNCTION__, lib_name, wrap); LOG("System library %s loaded at %p", lib_name, wrap);
LOG(" name=%s\n", wrap->GetName()); LOG(" name=%s\n", wrap->GetName());
return wrap; return wrap;
} }
...@@ -371,7 +368,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -371,7 +368,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
String full_path; String full_path;
if (!strchr(lib_name, '/')) { if (!strchr(lib_name, '/')) {
LOG("%s: Looking through the search path list\n", __FUNCTION__); LOG("Looking through the search path list");
const char* path = search_path_list->FindFile(lib_name); const char* path = search_path_list->FindFile(lib_name);
if (!path) { if (!path) {
error->Format("Can't find library file %s", lib_name); error->Format("Can't find library file %s", lib_name);
...@@ -389,7 +386,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -389,7 +386,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
// Absolute path. Easy. // Absolute path. Easy.
full_path = lib_name; full_path = lib_name;
} }
LOG("%s: Full library path: %s\n", __FUNCTION__, full_path.c_str()); LOG("Full library path: %s", full_path.c_str());
if (!PathIsFile(full_path.c_str())) { if (!PathIsFile(full_path.c_str())) {
error->Format("Library file doesn't exist: %s", full_path.c_str()); error->Format("Library file doesn't exist: %s", full_path.c_str());
return NULL; return NULL;
...@@ -401,7 +398,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -401,7 +398,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
return NULL; return NULL;
// Load all dependendent libraries. // Load all dependendent libraries.
LOG("%s: Loading dependencies of %s\n", __FUNCTION__, base_name); LOG("Loading dependencies of %s", base_name);
SharedLibrary::DependencyIterator iter(lib.Get()); SharedLibrary::DependencyIterator iter(lib.Get());
Vector<LibraryView*> dependencies; Vector<LibraryView*> dependencies;
while (iter.GetNext()) { while (iter.GetNext()) {
...@@ -420,14 +417,14 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -420,14 +417,14 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
dependencies.PushBack(dependency); dependencies.PushBack(dependency);
} }
if (CRAZY_DEBUG) { if (CRAZY_DEBUG) {
LOG("%s: Dependencies loaded for %s\n", __FUNCTION__, base_name); LOG("Dependencies loaded for %s", base_name);
for (size_t n = 0; n < dependencies.GetCount(); ++n) for (size_t n = 0; n < dependencies.GetCount(); ++n)
LOG(" ... %p %s\n", dependencies[n], dependencies[n]->GetName()); LOG(" ... %p %s\n", dependencies[n], dependencies[n]->GetName());
LOG(" dependencies @%p\n", &dependencies); LOG(" dependencies @%p\n", &dependencies);
} }
// Relocate the library. // Relocate the library.
LOG("%s: Relocating %s\n", __FUNCTION__, base_name); LOG("Relocating %s", base_name);
if (!lib->Relocate(this, &preloaded_libraries_, &dependencies, error)) if (!lib->Relocate(this, &preloaded_libraries_, &dependencies, error))
return NULL; return NULL;
...@@ -451,12 +448,12 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, ...@@ -451,12 +448,12 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
wrap->SetCrazy(lib.Get(), lib_name); wrap->SetCrazy(lib.Get(), lib_name);
known_libraries_.PushBack(wrap); known_libraries_.PushBack(wrap);
LOG("%s: Running constructors for %s\n", __FUNCTION__, base_name); LOG("Running constructors for %s", base_name);
// Now run the constructors. // Now run the constructors.
lib->CallConstructors(); lib->CallConstructors();
LOG("%s: Done loading %s\n", __FUNCTION__, base_name); LOG("Done loading %s", base_name);
lib.Release(); lib.Release();
return wrap; return wrap;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
namespace crazy { namespace crazy {
LibraryView::~LibraryView() { LibraryView::~LibraryView() {
LOG("%s: Destroying %s\n", __FUNCTION__, name_.c_str()); LOG("Destroying %s", name_.c_str());
if (type_ == TYPE_SYSTEM) { if (type_ == TYPE_SYSTEM) {
::dlclose(system_); ::dlclose(system_);
system_ = NULL; system_ = NULL;
......
...@@ -44,11 +44,8 @@ bool LineReader::GetNextLine() { ...@@ -44,11 +44,8 @@ bool LineReader::GetNextLine() {
line_len_ = 0; line_len_ = 0;
for (;;) { for (;;) {
LLOG("%s: LOOP line_start=%d buff_size=%d buff_capacity=%d\n", LLOG("LOOP line_start=%d buff_size=%d buff_capacity=%d", line_start_,
__FUNCTION__, buff_size_, buff_capacity_);
line_start_,
buff_size_,
buff_capacity_);
// Find the end of the current line in the current buffer. The result // Find the end of the current line in the current buffer. The result
// of memchr(_,_,0) is undefined, treated as not-found. // of memchr(_,_,0) is undefined, treated as not-found.
...@@ -62,12 +59,8 @@ bool LineReader::GetNextLine() { ...@@ -62,12 +59,8 @@ bool LineReader::GetNextLine() {
if (line_end != NULL) { if (line_end != NULL) {
// Found one, return it directly. // Found one, return it directly.
line_len_ = static_cast<size_t>(line_end + 1 - line); line_len_ = static_cast<size_t>(line_end + 1 - line);
LLOG("%s: LINE line_start=%d line_len=%d '%.*s'\n", LLOG("LINE line_start=%d line_len=%d '%.*s'\n", line_start_, line_len_,
__FUNCTION__, line_len_, buff_ + line_start_);
line_start_,
line_len_,
line_len_,
buff_ + line_start_);
return true; return true;
} }
...@@ -76,7 +69,7 @@ bool LineReader::GetNextLine() { ...@@ -76,7 +69,7 @@ bool LineReader::GetNextLine() {
::memmove(buff_, buff_ + line_start_, buff_size_ - line_start_); ::memmove(buff_, buff_ + line_start_, buff_size_ - line_start_);
buff_size_ -= line_start_; buff_size_ -= line_start_;
line_start_ = 0; line_start_ = 0;
LLOG("%s: MOVE buff_size=%d\n", __FUNCTION__, buff_size_); LLOG("MOVE buff_size=%d", buff_size_);
} }
// Handle end of input now. // Handle end of input now.
...@@ -87,15 +80,11 @@ bool LineReader::GetNextLine() { ...@@ -87,15 +80,11 @@ bool LineReader::GetNextLine() {
if (buff_size_ > 0 && buff_size_ < buff_capacity_) { if (buff_size_ > 0 && buff_size_ < buff_capacity_) {
buff_[buff_size_++] = '\n'; buff_[buff_size_++] = '\n';
line_len_ = buff_size_; line_len_ = buff_size_;
LLOG("%s: EOF_LINE buff_size=%d '%.*s'\n", LLOG("EOF_LINE buff_size=%d '%.*s'\n", buff_size_, buff_size_, buff_);
__FUNCTION__,
buff_size_,
buff_size_,
buff_);
return true; return true;
} }
// Otherwise, ignore the last line. // Otherwise, ignore the last line.
LLOG("%s: EOF\n", __FUNCTION__); LLOG("EOF");
return false; return false;
} }
...@@ -104,23 +93,15 @@ bool LineReader::GetNextLine() { ...@@ -104,23 +93,15 @@ bool LineReader::GetNextLine() {
buff_capacity_ *= 2; buff_capacity_ *= 2;
buff_ = static_cast<char*>(::realloc(buff_, buff_capacity_)); buff_ = static_cast<char*>(::realloc(buff_, buff_capacity_));
LLOG("%s: GROW buff_size=%d buff_capacity=%d '%.*s'\n", LLOG("GROW buff_size=%d buff_capacity=%d '%.*s'\n", buff_size_,
__FUNCTION__, buff_capacity_, buff_size_, buff_);
buff_size_,
buff_capacity_,
buff_size_,
buff_);
} }
// Try to fill the rest of buffer after current content. // Try to fill the rest of buffer after current content.
size_t avail = buff_capacity_ - buff_size_; size_t avail = buff_capacity_ - buff_size_;
int ret = fd_.Read(buff_ + buff_size_, avail); int ret = fd_.Read(buff_ + buff_size_, avail);
LLOG("%s: READ buff_size=%d buff_capacity=%d avail=%d ret=%d\n", LLOG("READ buff_size=%d buff_capacity=%d avail=%d ret=%d\n", buff_size_,
__FUNCTION__, buff_capacity_, avail, ret);
buff_size_,
buff_capacity_,
avail,
ret);
if (ret <= 0) { if (ret <= 0) {
eof_ = true; eof_ = true;
ret = 0; ret = 0;
......
...@@ -229,11 +229,11 @@ bool FindElfBinaryForAddress(void* address, ...@@ -229,11 +229,11 @@ bool FindElfBinaryForAddress(void* address,
if (entry.vma_start <= addr && addr < entry.vma_end) { if (entry.vma_start <= addr && addr < entry.vma_end) {
*load_address = entry.vma_start; *load_address = entry.vma_start;
if (!entry.path) { if (!entry.path) {
LOG("Could not find ELF binary path!?\n"); LOG("Could not find ELF binary path!?");
return false; return false;
} }
if (entry.path_len >= path_buffer_len) { if (entry.path_len >= path_buffer_len) {
LOG("ELF binary path too long: '%s'\n", entry.path); LOG("ELF binary path too long: '%s'", entry.path);
return false; return false;
} }
memcpy(path_buffer, entry.path, entry.path_len); memcpy(path_buffer, entry.path, entry.path_len);
......
...@@ -30,12 +30,12 @@ bool FindExecutablePath(String* exe_path) { ...@@ -30,12 +30,12 @@ bool FindExecutablePath(String* exe_path) {
ssize_t ret = TEMP_FAILURE_RETRY( ssize_t ret = TEMP_FAILURE_RETRY(
readlink("/proc/self/exe", exe_path->ptr(), exe_path->size())); readlink("/proc/self/exe", exe_path->ptr(), exe_path->size()));
if (ret < 0) { if (ret < 0) {
LOG_ERRNO("%s: Could not get /proc/self/exe link", __FUNCTION__); LOG_ERRNO("Could not get /proc/self/exe link");
return false; return false;
} }
exe_path->Resize(static_cast<size_t>(ret)); exe_path->Resize(static_cast<size_t>(ret));
LOG("%s: Current executable: %s\n", __FUNCTION__, exe_path->c_str()); LOG("Current executable: %s", exe_path->c_str());
return true; return true;
} }
...@@ -55,7 +55,7 @@ bool FindElfDynamicSection(const char* path, ...@@ -55,7 +55,7 @@ bool FindElfDynamicSection(const char* path,
crazy::FileDescriptor fd; crazy::FileDescriptor fd;
if (!fd.OpenReadOnly(path) || if (!fd.OpenReadOnly(path) ||
fd.Read(header, sizeof(header)) != static_cast<int>(sizeof(header))) { fd.Read(header, sizeof(header)) != static_cast<int>(sizeof(header))) {
LOG_ERRNO("%s: Could not load ELF binary header", __FUNCTION__); LOG_ERRNO("Could not load ELF binary header");
return false; return false;
} }
...@@ -63,21 +63,18 @@ bool FindElfDynamicSection(const char* path, ...@@ -63,21 +63,18 @@ bool FindElfDynamicSection(const char* path,
if (header->e_ident[0] != 127 || header->e_ident[1] != 'E' || if (header->e_ident[0] != 127 || header->e_ident[1] != 'E' ||
header->e_ident[2] != 'L' || header->e_ident[3] != 'F' || header->e_ident[2] != 'L' || header->e_ident[3] != 'F' ||
header->e_ident[4] != ELF::kElfClass) { header->e_ident[4] != ELF::kElfClass) {
LOG("%s: Not a %d-bit ELF binary: %s\n", LOG("Not a %d-bit ELF binary: %s", ELF::kElfBits, path);
__FUNCTION__,
ELF::kElfBits,
path);
return false; return false;
} }
if (header->e_phoff == 0 || header->e_phentsize != sizeof(ELF::Phdr)) { if (header->e_phoff == 0 || header->e_phentsize != sizeof(ELF::Phdr)) {
LOG("%s: Invalid program header values: %s\n", __FUNCTION__, path); LOG("Invalid program header values: %s", path);
return false; return false;
} }
// Scan the program header table. // Scan the program header table.
if (fd.SeekTo(header->e_phoff) < 0) { if (fd.SeekTo(header->e_phoff) < 0) {
LOG_ERRNO("%s: Could not find ELF program header table", __FUNCTION__); LOG_ERRNO("Could not find ELF program header table");
return false; return false;
} }
...@@ -89,7 +86,7 @@ bool FindElfDynamicSection(const char* path, ...@@ -89,7 +86,7 @@ bool FindElfDynamicSection(const char* path,
for (size_t n = 0; n < header->e_phnum; ++n) { for (size_t n = 0; n < header->e_phnum; ++n) {
ELF::Phdr phdr; ELF::Phdr phdr;
if (fd.Read(&phdr, sizeof(phdr)) != sizeof(phdr)) { if (fd.Read(&phdr, sizeof(phdr)) != sizeof(phdr)) {
LOG_ERRNO("%s: Could not read program header entry", __FUNCTION__); LOG_ERRNO("Could not read program header entry");
return false; return false;
} }
...@@ -103,23 +100,19 @@ bool FindElfDynamicSection(const char* path, ...@@ -103,23 +100,19 @@ bool FindElfDynamicSection(const char* path,
} }
if (!found_load0) { if (!found_load0) {
LOG("%s: Could not find loadable segment!?\n", __FUNCTION__); LOG("Could not find loadable segment!?");
return false; return false;
} }
if (!found_dyn) { if (!found_dyn) {
LOG("%s: Could not find dynamic segment!?\n", __FUNCTION__); LOG("Could not find dynamic segment!?");
return false; return false;
} }
LOG("%s: Found first loadable segment [offset=%p vaddr=%p]\n", LOG("Found first loadable segment [offset=%p vaddr=%p]",
__FUNCTION__, (void*)phdr_load0.p_offset, (void*)phdr_load0.p_vaddr);
(void*)phdr_load0.p_offset,
(void*)phdr_load0.p_vaddr);
LOG("%s: Found dynamic segment [offset=%p vaddr=%p size=%p]\n", LOG("Found dynamic segment [offset=%p vaddr=%p size=%p]",
__FUNCTION__, (void*)phdr_dyn.p_offset, (void*)phdr_dyn.p_vaddr,
(void*)phdr_dyn.p_offset,
(void*)phdr_dyn.p_vaddr,
(void*)phdr_dyn.p_memsz); (void*)phdr_dyn.p_memsz);
// Parse /proc/self/maps to find the load address of the first // Parse /proc/self/maps to find the load address of the first
...@@ -132,25 +125,20 @@ bool FindElfDynamicSection(const char* path, ...@@ -132,25 +125,20 @@ bool FindElfDynamicSection(const char* path,
memcmp(entry.path, path, path_len) != 0) memcmp(entry.path, path, path_len) != 0)
continue; continue;
LOG("%s: Found executable segment mapped [%p-%p offset=%p]\n", LOG("Found executable segment mapped [%p-%p offset=%p]",
__FUNCTION__, (void*)entry.vma_start, (void*)entry.vma_end, (void*)entry.load_offset);
(void*)entry.vma_start,
(void*)entry.vma_end,
(void*)entry.load_offset);
size_t load_bias = entry.vma_start - phdr_load0.p_vaddr; size_t load_bias = entry.vma_start - phdr_load0.p_vaddr;
LOG("%s: Load bias is %p\n", __FUNCTION__, (void*)load_bias); LOG("Load bias is %p", (void*)load_bias);
*dynamic_address = load_bias + phdr_dyn.p_vaddr; *dynamic_address = load_bias + phdr_dyn.p_vaddr;
*dynamic_size = phdr_dyn.p_memsz; *dynamic_size = phdr_dyn.p_memsz;
LOG("%s: Dynamic section addr=%p size=%p\n", LOG("Dynamic section addr=%p size=%p", (void*)*dynamic_address,
__FUNCTION__,
(void*)*dynamic_address,
(void*)*dynamic_size); (void*)*dynamic_size);
return true; return true;
} }
LOG("%s: Executable is not mapped in current process.\n", __FUNCTION__); LOG("Executable is not mapped in current process.");
return false; return false;
} }
...@@ -235,24 +223,16 @@ bool RDebug::Init() { ...@@ -235,24 +223,16 @@ bool RDebug::Init() {
while (dynamic_size >= sizeof(*dyn_section)) { while (dynamic_size >= sizeof(*dyn_section)) {
if (dyn_section->d_tag == DT_DEBUG) { if (dyn_section->d_tag == DT_DEBUG) {
// Found it! // Found it!
LOG("%s: Found DT_DEBUG entry inside %s at %p, pointing to %p\n", LOG("Found DT_DEBUG entry inside %s at %p, pointing to %p", path.c_str(),
__FUNCTION__, dyn_section, dyn_section->d_un.d_ptr);
path.c_str(),
dyn_section,
dyn_section->d_un.d_ptr);
if (dyn_section->d_un.d_ptr) { if (dyn_section->d_un.d_ptr) {
r_debug_ = reinterpret_cast<r_debug*>(dyn_section->d_un.d_ptr); r_debug_ = reinterpret_cast<r_debug*>(dyn_section->d_un.d_ptr);
LOG("%s: r_debug [r_version=%d r_map=%p r_brk=%p r_ldbase=%p]\n", LOG("r_debug [r_version=%d r_map=%p r_brk=%p r_ldbase=%p]",
__FUNCTION__, r_debug_->r_version, r_debug_->r_map, r_debug_->r_brk,
r_debug_->r_version,
r_debug_->r_map,
r_debug_->r_brk,
r_debug_->r_ldbase); r_debug_->r_ldbase);
// Only version 1 of the struct is supported. // Only version 1 of the struct is supported.
if (r_debug_->r_version != 1) { if (r_debug_->r_version != 1) {
LOG("%s: r_debug.r_version is %d, 1 expected.\n", LOG("r_debug.r_version is %d, 1 expected.", r_debug_->r_version);
__FUNCTION__,
r_debug_->r_version);
r_debug_ = NULL; r_debug_ = NULL;
} }
...@@ -263,8 +243,7 @@ bool RDebug::Init() { ...@@ -263,8 +243,7 @@ bool RDebug::Init() {
int prot = self_maps.GetProtectionFlagsForAddress(r_debug_->r_map); int prot = self_maps.GetProtectionFlagsForAddress(r_debug_->r_map);
readonly_entries_ = (prot & PROT_WRITE) == 0; readonly_entries_ = (prot & PROT_WRITE) == 0;
LOG("%s: r_debug.readonly_entries=%s\n", LOG("r_debug.readonly_entries=%s",
__FUNCTION__,
readonly_entries_ ? "true" : "false"); readonly_entries_ ? "true" : "false");
return true; return true;
} }
...@@ -273,7 +252,7 @@ bool RDebug::Init() { ...@@ -273,7 +252,7 @@ bool RDebug::Init() {
dynamic_size -= sizeof(*dyn_section); dynamic_size -= sizeof(*dyn_section);
} }
LOG("%s: There is no non-0 DT_DEBUG entry in this process\n", __FUNCTION__); LOG("There is no non-0 DT_DEBUG entry in this process");
return false; return false;
} }
...@@ -332,7 +311,7 @@ class RDebugRunnable { ...@@ -332,7 +311,7 @@ class RDebugRunnable {
void RDebugRunnable::Run(void* opaque) { void RDebugRunnable::Run(void* opaque) {
RDebugRunnable* runnable = static_cast<RDebugRunnable*>(opaque); RDebugRunnable* runnable = static_cast<RDebugRunnable*>(opaque);
LOG("%s: Callback received, runnable=%p\n", __FUNCTION__, runnable); LOG("Callback received, runnable=%p", runnable);
(*runnable->handler_)(runnable->rdebug_, runnable->entry_); (*runnable->handler_)(runnable->rdebug_, runnable->entry_);
if (!runnable->is_blocking_) { if (!runnable->is_blocking_) {
...@@ -340,7 +319,7 @@ void RDebugRunnable::Run(void* opaque) { ...@@ -340,7 +319,7 @@ void RDebugRunnable::Run(void* opaque) {
return; return;
} }
LOG("%s: Signalling callback, runnable=%p\n", __FUNCTION__, runnable); LOG("Signalling callback, runnable=%p", runnable);
{ {
ScopedMutexLock m(&runnable->mutex_); ScopedMutexLock m(&runnable->mutex_);
runnable->has_run_ = true; runnable->has_run_ = true;
...@@ -353,11 +332,11 @@ void RDebugRunnable::WaitForCallback(void* opaque) { ...@@ -353,11 +332,11 @@ void RDebugRunnable::WaitForCallback(void* opaque) {
RDebugRunnable* runnable = static_cast<RDebugRunnable*>(opaque); RDebugRunnable* runnable = static_cast<RDebugRunnable*>(opaque);
if (!runnable->is_blocking_) { if (!runnable->is_blocking_) {
LOG("%s: Non-blocking, not waiting, runnable=%p\n", __FUNCTION__, runnable); LOG("Non-blocking, not waiting, runnable=%p", runnable);
return; return;
} }
LOG("%s: Waiting for signal, runnable=%p\n", __FUNCTION__, runnable); LOG("Waiting for signal, runnable=%p", runnable);
{ {
ScopedMutexLock m(&runnable->mutex_); ScopedMutexLock m(&runnable->mutex_);
while (!runnable->has_run_) while (!runnable->has_run_)
...@@ -377,7 +356,7 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler, ...@@ -377,7 +356,7 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler,
link_map_t* entry, link_map_t* entry,
bool is_blocking) { bool is_blocking) {
if (!post_for_later_execution_) { if (!post_for_later_execution_) {
LOG("%s: Deferred execution disabled\n", __FUNCTION__); LOG("Deferred execution disabled");
return false; return false;
} }
...@@ -386,16 +365,16 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler, ...@@ -386,16 +365,16 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler,
void* context = post_for_later_execution_context_; void* context = post_for_later_execution_context_;
if (!(*post_for_later_execution_)(context, &RDebugRunnable::Run, runnable)) { if (!(*post_for_later_execution_)(context, &RDebugRunnable::Run, runnable)) {
LOG("%s: Deferred execution enabled, but posting failed\n", __FUNCTION__); LOG("Deferred execution enabled, but posting failed");
delete runnable; delete runnable;
return false; return false;
} }
LOG("%s: Posted for later execution, runnable=%p\n", __FUNCTION__, runnable); LOG("Posted for later execution, runnable=%p", runnable);
if (is_blocking) { if (is_blocking) {
RDebugRunnable::WaitForCallback(runnable); RDebugRunnable::WaitForCallback(runnable);
LOG("%s: Completed execution, runnable=%p\n", __FUNCTION__, runnable); LOG("Completed execution, runnable=%p", runnable);
} }
return true; return true;
...@@ -408,7 +387,7 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler, ...@@ -408,7 +387,7 @@ bool RDebug::PostCallback(rdebug_callback_handler_t handler,
// assignment. // assignment.
void RDebug::WriteLinkMapField(link_map_t** link_pointer, link_map_t* entry) { void RDebug::WriteLinkMapField(link_map_t** link_pointer, link_map_t* entry) {
ScopedPageReadWriteRemapper mapper(link_pointer); ScopedPageReadWriteRemapper mapper(link_pointer);
LOG("%s: Remapped page for %p for read/write\n", __FUNCTION__, link_pointer); LOG("Remapped page for %p for read/write", link_pointer);
*link_pointer = entry; *link_pointer = entry;
...@@ -428,17 +407,17 @@ void RDebug::WriteLinkMapField(link_map_t** link_pointer, link_map_t* entry) { ...@@ -428,17 +407,17 @@ void RDebug::WriteLinkMapField(link_map_t** link_pointer, link_map_t* entry) {
// https://code.google.com/p/chromium/issues/detail?id=450659 // https://code.google.com/p/chromium/issues/detail?id=450659
// https://code.google.com/p/chromium/issues/detail?id=458346 // https://code.google.com/p/chromium/issues/detail?id=458346
mapper.Release(); mapper.Release();
LOG("%s: Released mapper, leaving page read/write\n", __FUNCTION__); LOG("Released mapper, leaving page read/write");
} }
void RDebug::AddEntryImpl(link_map_t* entry) { void RDebug::AddEntryImpl(link_map_t* entry) {
ScopedGlobalLock lock; ScopedGlobalLock lock;
LOG("%s: Adding: %s\n", __FUNCTION__, entry->l_name); LOG("Adding: %s", entry->l_name);
if (!init_) if (!init_)
Init(); Init();
if (!r_debug_) { if (!r_debug_) {
LOG("%s: Nothing to do\n", __FUNCTION__); LOG("Nothing to do");
return; return;
} }
...@@ -463,7 +442,7 @@ void RDebug::AddEntryImpl(link_map_t* entry) { ...@@ -463,7 +442,7 @@ void RDebug::AddEntryImpl(link_map_t* entry) {
if (!r_debug_->r_map || !r_debug_->r_map->l_next || if (!r_debug_->r_map || !r_debug_->r_map->l_next ||
!r_debug_->r_map->l_next->l_next) { !r_debug_->r_map->l_next->l_next) {
// Sanity check: Must have at least two items in the list. // Sanity check: Must have at least two items in the list.
LOG("%s: Malformed r_debug.r_map list\n", __FUNCTION__); LOG("Malformed r_debug.r_map list");
r_debug_ = NULL; r_debug_ = NULL;
return; return;
} }
...@@ -491,7 +470,7 @@ void RDebug::AddEntryImpl(link_map_t* entry) { ...@@ -491,7 +470,7 @@ void RDebug::AddEntryImpl(link_map_t* entry) {
void RDebug::DelEntryImpl(link_map_t* entry) { void RDebug::DelEntryImpl(link_map_t* entry) {
ScopedGlobalLock lock; ScopedGlobalLock lock;
LOG("%s: Deleting: %s\n", __FUNCTION__, entry->l_name); LOG("Deleting: %s", entry->l_name);
if (!r_debug_) if (!r_debug_)
return; return;
......
...@@ -36,7 +36,7 @@ const char* SearchPathList::FindFile(const char* file_name) { ...@@ -36,7 +36,7 @@ const char* SearchPathList::FindFile(const char* file_name) {
if (!file_name || !*file_name) if (!file_name || !*file_name)
return NULL; return NULL;
LOG("%s: Looking for %s\n", __FUNCTION__, file_name); LOG("Looking for %s", file_name);
// Build full list by appending the env_list_ after the regular one. // Build full list by appending the env_list_ after the regular one.
String full_list = list_; String full_list = list_;
...@@ -71,10 +71,10 @@ const char* SearchPathList::FindFile(const char* file_name) { ...@@ -71,10 +71,10 @@ const char* SearchPathList::FindFile(const char* file_name) {
full_path_ += file_name; full_path_ += file_name;
if (PathIsFile(full_path_.c_str())) { if (PathIsFile(full_path_.c_str())) {
LOG(" FOUND %s\n", full_path_.c_str()); LOG(" FOUND %s", full_path_.c_str());
return full_path_.c_str(); return full_path_.c_str();
} else } else
LOG(" skip %s\n", full_path_.c_str()); LOG(" skip %s", full_path_.c_str());
} }
return NULL; return NULL;
......
...@@ -82,7 +82,7 @@ typedef void (*JNI_OnUnloadFunctionPtr)(void* vm, void* reserved); ...@@ -82,7 +82,7 @@ typedef void (*JNI_OnUnloadFunctionPtr)(void* vm, void* reserved);
void CallFunction(linker_function_t func, const char* func_type) { void CallFunction(linker_function_t func, const char* func_type) {
uintptr_t func_address = reinterpret_cast<uintptr_t>(func); uintptr_t func_address = reinterpret_cast<uintptr_t>(func);
LOG("%s: %p %s\n", __FUNCTION__, func, func_type); LOG("%p %s", func, func_type);
if (func_address != 0 && func_address != uintptr_t(-1)) if (func_address != 0 && func_address != uintptr_t(-1))
func(); func();
} }
...@@ -124,7 +124,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver { ...@@ -124,7 +124,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver {
// https://code.google.com/p/android/issues/detail?id=74255 // https://code.google.com/p/android/issues/detail?id=74255
for (size_t n = 0; n < preloads_->GetCount(); ++n) { for (size_t n = 0; n < preloads_->GetCount(); ++n) {
LibraryView* wrap = (*preloads_)[n]; LibraryView* wrap = (*preloads_)[n];
// LOG("%s: Looking into preload %p (%s)\n", __FUNCTION__, wrap, // LOG("Looking into preload %p (%s)", wrap,
// wrap->GetName()); // wrap->GetName());
address = LookupInWrap(symbol_name, wrap); address = LookupInWrap(symbol_name, wrap);
if (address) if (address)
...@@ -139,7 +139,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver { ...@@ -139,7 +139,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver {
// Then look inside the dependencies. // Then look inside the dependencies.
for (size_t n = 0; n < dependencies_->GetCount(); ++n) { for (size_t n = 0; n < dependencies_->GetCount(); ++n) {
LibraryView* wrap = (*dependencies_)[n]; LibraryView* wrap = (*dependencies_)[n];
// LOG("%s: Looking into dependency %p (%s)\n", __FUNCTION__, wrap, // LOG("Looking into dependency %p (%s)", wrap,
// wrap->GetName()); // wrap->GetName());
address = LookupInWrap(symbol_name, wrap); address = LookupInWrap(symbol_name, wrap);
if (address) if (address)
...@@ -208,7 +208,7 @@ bool SharedLibrary::Load(const char* full_path, ...@@ -208,7 +208,7 @@ bool SharedLibrary::Load(const char* full_path,
size_t file_offset, size_t file_offset,
Error* error) { Error* error) {
// First, record the path. // First, record the path.
LOG("%s: full path '%s'\n", __FUNCTION__, full_path); LOG("full path '%s'", full_path);
size_t full_path_len = strlen(full_path); size_t full_path_len = strlen(full_path);
if (full_path_len >= sizeof(full_path_)) { if (full_path_len >= sizeof(full_path_)) {
...@@ -220,7 +220,7 @@ bool SharedLibrary::Load(const char* full_path, ...@@ -220,7 +220,7 @@ bool SharedLibrary::Load(const char* full_path,
base_name_ = GetBaseNamePtr(full_path_); base_name_ = GetBaseNamePtr(full_path_);
// Load the ELF binary in memory. // Load the ELF binary in memory.
LOG("%s: Loading ELF segments for %s\n", __FUNCTION__, base_name_); LOG("Loading ELF segments for %s", base_name_);
{ {
ElfLoader loader; ElfLoader loader;
...@@ -251,12 +251,12 @@ bool SharedLibrary::Load(const char* full_path, ...@@ -251,12 +251,12 @@ bool SharedLibrary::Load(const char* full_path,
} }
#ifdef __arm__ #ifdef __arm__
LOG("%s: Extracting ARM.exidx table for %s\n", __FUNCTION__, base_name_); LOG("Extracting ARM.exidx table for %s", base_name_);
(void)phdr_table_get_arm_exidx( (void)phdr_table_get_arm_exidx(
phdr(), phdr_count(), load_bias(), &arm_exidx_, &arm_exidx_count_); phdr(), phdr_count(), load_bias(), &arm_exidx_, &arm_exidx_count_);
#endif #endif
LOG("%s: Parsing dynamic table for %s\n", __FUNCTION__, base_name_); LOG("Parsing dynamic table for %s", base_name_);
ElfView::DynamicIterator dyn(&view_); ElfView::DynamicIterator dyn(&view_);
for (; dyn.HasNext(); dyn.GetNext()) { for (; dyn.HasNext(); dyn.GetNext()) {
ELF::Addr dyn_value = dyn.GetValue(); ELF::Addr dyn_value = dyn.GetValue();
...@@ -269,45 +269,42 @@ bool SharedLibrary::Load(const char* full_path, ...@@ -269,45 +269,42 @@ bool SharedLibrary::Load(const char* full_path,
} }
break; break;
case DT_INIT: case DT_INIT:
LOG(" DT_INIT addr=%p\n", dyn_addr); LOG(" DT_INIT addr=%p", dyn_addr);
init_func_ = reinterpret_cast<linker_function_t>(dyn_addr); init_func_ = reinterpret_cast<linker_function_t>(dyn_addr);
break; break;
case DT_FINI: case DT_FINI:
LOG(" DT_FINI addr=%p\n", dyn_addr); LOG(" DT_FINI addr=%p", dyn_addr);
fini_func_ = reinterpret_cast<linker_function_t>(dyn_addr); fini_func_ = reinterpret_cast<linker_function_t>(dyn_addr);
break; break;
case DT_INIT_ARRAY: case DT_INIT_ARRAY:
LOG(" DT_INIT_ARRAY addr=%p\n", dyn_addr); LOG(" DT_INIT_ARRAY addr=%p", dyn_addr);
init_array_ = reinterpret_cast<linker_function_t*>(dyn_addr); init_array_ = reinterpret_cast<linker_function_t*>(dyn_addr);
break; break;
case DT_INIT_ARRAYSZ: case DT_INIT_ARRAYSZ:
init_array_count_ = dyn_value / sizeof(ELF::Addr); init_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_INIT_ARRAYSZ value=%p count=%p\n", LOG(" DT_INIT_ARRAYSZ value=%p count=%p", dyn_value,
dyn_value,
init_array_count_); init_array_count_);
break; break;
case DT_FINI_ARRAY: case DT_FINI_ARRAY:
LOG(" DT_FINI_ARRAY addr=%p\n", dyn_addr); LOG(" DT_FINI_ARRAY addr=%p", dyn_addr);
fini_array_ = reinterpret_cast<linker_function_t*>(dyn_addr); fini_array_ = reinterpret_cast<linker_function_t*>(dyn_addr);
break; break;
case DT_FINI_ARRAYSZ: case DT_FINI_ARRAYSZ:
fini_array_count_ = dyn_value / sizeof(ELF::Addr); fini_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_FINI_ARRAYSZ value=%p count=%p\n", LOG(" DT_FINI_ARRAYSZ value=%p count=%p", dyn_value,
dyn_value,
fini_array_count_); fini_array_count_);
break; break;
case DT_PREINIT_ARRAY: case DT_PREINIT_ARRAY:
LOG(" DT_PREINIT_ARRAY addr=%p\n", dyn_addr); LOG(" DT_PREINIT_ARRAY addr=%p", dyn_addr);
preinit_array_ = reinterpret_cast<linker_function_t*>(dyn_addr); preinit_array_ = reinterpret_cast<linker_function_t*>(dyn_addr);
break; break;
case DT_PREINIT_ARRAYSZ: case DT_PREINIT_ARRAYSZ:
preinit_array_count_ = dyn_value / sizeof(ELF::Addr); preinit_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_PREINIT_ARRAYSZ value=%p count=%p\n", LOG(" DT_PREINIT_ARRAYSZ value=%p count=%p", dyn_value,
dyn_value,
preinit_array_count_); preinit_array_count_);
break; break;
case DT_SYMBOLIC: case DT_SYMBOLIC:
LOG(" DT_SYMBOLIC\n"); LOG(" DT_SYMBOLIC");
has_DT_SYMBOLIC_ = true; has_DT_SYMBOLIC_ = true;
break; break;
case DT_FLAGS: case DT_FLAGS:
...@@ -325,7 +322,7 @@ bool SharedLibrary::Load(const char* full_path, ...@@ -325,7 +322,7 @@ bool SharedLibrary::Load(const char* full_path,
} }
} }
LOG("%s: Load complete for %s\n", __FUNCTION__, base_name_); LOG("Load complete for %s", base_name_);
return true; return true;
} }
...@@ -334,7 +331,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list, ...@@ -334,7 +331,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list,
Vector<LibraryView*>* dependencies, Vector<LibraryView*>* dependencies,
Error* error) { Error* error) {
// Apply relocations. // Apply relocations.
LOG("%s: Applying relocations to %s\n", __FUNCTION__, base_name_); LOG("Applying relocations to %s", base_name_);
ElfRelocations relocations; ElfRelocations relocations;
...@@ -345,7 +342,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list, ...@@ -345,7 +342,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list,
if (!relocations.ApplyAll(&symbols_, &resolver, error)) if (!relocations.ApplyAll(&symbols_, &resolver, error))
return false; return false;
LOG("%s: Relocations applied for %s\n", __FUNCTION__, base_name_); LOG("Relocations applied for %s", base_name_);
return true; return true;
} }
...@@ -394,11 +391,8 @@ bool SharedLibrary::UseSharedRelro(size_t relro_start, ...@@ -394,11 +391,8 @@ bool SharedLibrary::UseSharedRelro(size_t relro_start,
size_t relro_size, size_t relro_size,
int relro_fd, int relro_fd,
Error* error) { Error* error) {
LOG("%s: relro_start=%p relro_size=%p relro_fd=%d\n", LOG("relro_start=%p relro_size=%p relro_fd=%d", (void*)relro_start,
__FUNCTION__, (void*)relro_size, relro_fd);
(void*)relro_start,
(void*)relro_size,
relro_fd);
if (relro_fd < 0 || relro_size == 0) { if (relro_fd < 0 || relro_size == 0) {
// Nothing to do here. // Nothing to do here.
......
...@@ -74,8 +74,7 @@ class ScopedMMap { ...@@ -74,8 +74,7 @@ class ScopedMMap {
ScopedMMap(void* mem, uint32_t len) : mem_(mem), len_(len) {} ScopedMMap(void* mem, uint32_t len) : mem_(mem), len_(len) {}
~ScopedMMap() { ~ScopedMMap() {
if (munmap(mem_, len_) == -1) { if (munmap(mem_, len_) == -1) {
LOG_ERRNO("%s: munmap failed when trying to unmap zip file\n", LOG_ERRNO("munmap failed when trying to unmap zip file");
__FUNCTION__);
} }
} }
private: private:
...@@ -107,30 +106,26 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -107,30 +106,26 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
// Open the file // Open the file
FileDescriptor fd; FileDescriptor fd;
if (!fd.OpenReadOnly(zip_file)) { if (!fd.OpenReadOnly(zip_file)) {
LOG_ERRNO("%s: open failed trying to open zip file %s\n", LOG_ERRNO("open failed trying to open zip file %s", zip_file);
__FUNCTION__, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
// Find the length of the file. // Find the length of the file.
struct stat stat_buf; struct stat stat_buf;
if (stat(zip_file, &stat_buf) == -1) { if (stat(zip_file, &stat_buf) == -1) {
LOG_ERRNO("%s: stat failed trying to stat zip file %s\n", LOG_ERRNO("stat failed trying to stat zip file %s", zip_file);
__FUNCTION__, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
if (stat_buf.st_size > kMaxZipFileLength) { if (stat_buf.st_size > kMaxZipFileLength) {
LOG("%s: The size %ld of %s is too large to map\n", LOG("The size %ld of %s is too large to map", stat_buf.st_size, zip_file);
__FUNCTION__, stat_buf.st_size, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
// Map the file into memory. // Map the file into memory.
void* mem = fd.Map(NULL, stat_buf.st_size, PROT_READ, MAP_PRIVATE, 0); void* mem = fd.Map(NULL, stat_buf.st_size, PROT_READ, MAP_PRIVATE, 0);
if (mem == MAP_FAILED) { if (mem == MAP_FAILED) {
LOG_ERRNO("%s: mmap failed trying to mmap zip file %s\n", LOG_ERRNO("mmap failed trying to mmap zip file %s", zip_file);
__FUNCTION__, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
ScopedMMap scoped_mmap(mem, stat_buf.st_size); ScopedMMap scoped_mmap(mem, stat_buf.st_size);
...@@ -147,8 +142,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -147,8 +142,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
} }
} }
if (off == -1) { if (off == -1) {
LOG("%s: Failed to find end of central directory in %s\n", LOG("Failed to find end of central directory in %s", zip_file);
__FUNCTION__, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
...@@ -161,15 +155,15 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -161,15 +155,15 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
mem_bytes, off + kOffsetOfStartOfCentralDirInEndOfCentralDirectory); mem_bytes, off + kOffsetOfStartOfCentralDirInEndOfCentralDirectory);
if (start_of_central_dir > off) { if (start_of_central_dir > off) {
LOG("%s: Found out of range offset %u for start of directory in %s\n", LOG("Found out of range offset %u for start of directory in %s",
__FUNCTION__, start_of_central_dir, zip_file); start_of_central_dir, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
uint32_t end_of_central_dir = start_of_central_dir + length_of_central_dir; uint32_t end_of_central_dir = start_of_central_dir + length_of_central_dir;
if (end_of_central_dir > off) { if (end_of_central_dir > off) {
LOG("%s: Found out of range offset %u for end of directory in %s\n", LOG("Found out of range offset %u for end of directory in %s",
__FUNCTION__, end_of_central_dir, zip_file); end_of_central_dir, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
...@@ -183,8 +177,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -183,8 +177,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
for (; n < num_entries && off < end_of_central_dir; ++n) { for (; n < num_entries && off < end_of_central_dir; ++n) {
uint32_t marker = ReadUInt32(mem_bytes, off); uint32_t marker = ReadUInt32(mem_bytes, off);
if (marker != kCentralDirHeaderMarker) { if (marker != kCentralDirHeaderMarker) {
LOG("%s: Failed to find central directory header marker in %s. " LOG("Failed to find central directory header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__, "Found 0x%x but expected 0x%x",
zip_file, marker, kCentralDirHeaderMarker); zip_file, marker, kCentralDirHeaderMarker);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
...@@ -208,8 +202,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -208,8 +202,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
// Filename matches. Read the local header and compute the offset. // Filename matches. Read the local header and compute the offset.
uint32_t marker = ReadUInt32(mem_bytes, local_header_offset); uint32_t marker = ReadUInt32(mem_bytes, local_header_offset);
if (marker != kLocalHeaderMarker) { if (marker != kLocalHeaderMarker) {
LOG("%s: Failed to find local file header marker in %s. " LOG("Failed to find local file header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__, "Found 0x%x but expected 0x%x",
zip_file, marker, kLocalHeaderMarker); zip_file, marker, kLocalHeaderMarker);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
...@@ -219,8 +213,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -219,8 +213,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
mem_bytes, mem_bytes,
local_header_offset + kOffsetCompressionMethodInLocalHeader); local_header_offset + kOffsetCompressionMethodInLocalHeader);
if (compression_method != kCompressionMethodStored) { if (compression_method != kCompressionMethodStored) {
LOG("%s: %s is compressed within %s. " LOG("%s is compressed within %s. "
"Found compression method %u but expected %u\n", __FUNCTION__, "Found compression method %u but expected %u",
filename, zip_file, compression_method, kCompressionMethodStored); filename, zip_file, compression_method, kCompressionMethodStored);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
...@@ -243,16 +237,17 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) { ...@@ -243,16 +237,17 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
} }
if (n < num_entries) { if (n < num_entries) {
LOG("%s: Did not find all the expected entries in the central directory. " LOG("Did not find all the expected entries in the central directory. "
"Found %d but expected %d\n", __FUNCTION__, n, num_entries); "Found %d but expected %d",
n, num_entries);
} }
if (off < end_of_central_dir) { if (off < end_of_central_dir) {
LOG("%s: There are %d extra bytes at the end of the central directory.\n", LOG("There are %d extra bytes at the end of the central directory.",
__FUNCTION__, end_of_central_dir - off); end_of_central_dir - off);
} }
LOG("%s: Did not find %s in %s\n", __FUNCTION__, filename, zip_file); LOG("Did not find %s in %s", filename, zip_file);
return CRAZY_OFFSET_FAILED; return CRAZY_OFFSET_FAILED;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment