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) {
// First, check that trying to map a page of the region with PROT_WRITE
// fails with EPERM.
if (map.Allocate(NULL, map_size, MemoryMapping::CAN_WRITE, fd)) {
LOG("%s: Region could be mapped writable. Should not happen.\n",
__FUNCTION__);
LOG("Region could be mapped writable. Should not happen.");
errno = EPERM;
return false;
}
if (errno != EPERM) {
LOG_ERRNO("%s: Region failed writable mapping with unexpected error",
__FUNCTION__);
LOG_ERRNO("Region failed writable mapping with unexpected error");
return false;
}
// Second, check that it can be mapped PROT_READ, but cannot be remapped
// with PROT_READ | PROT_WRITE through mprotect().
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;
}
if (map.SetProtection(MemoryMapping::CAN_READ_WRITE)) {
LOG_ERRNO("%s: Region could be remapped read-write. Should not happen.\n",
__FUNCTION__);
LOG_ERRNO("Region could be remapped read-write. Should not happen.");
return false;
}
if (errno != EACCES) {
LOG_ERRNO(
"%s: Region failed to be remapped read-write with unexpected error",
__FUNCTION__);
LOG_ERRNO("Region failed to be remapped read-write with unexpected error");
return false;
}
......
......@@ -13,6 +13,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
namespace crazy {
......@@ -20,47 +21,75 @@ namespace crazy {
namespace {
void LogArgs(const char* fmt, va_list args, bool print_error, int error) {
const size_t buffer_size = 4096;
char* buffer = reinterpret_cast<char*>(::malloc(buffer_size));
int ret;
ret = vsnprintf(buffer, buffer_size, fmt, args);
if (ret >= static_cast<int>(buffer_size))
ret = static_cast<int>(buffer_size) - 1;
struct LogBuffer {
LogBuffer() = default;
void Append(const char* str) {
int avail = kSize - pos_;
int ret = snprintf(buffer_ + pos_, avail, "%s", str);
if (ret >= avail) {
pos_ = kSize - 1;
} else {
pos_ += ret;
}
}
if (print_error) {
strlcat(buffer, ": ", buffer_size);
strlcat(buffer, strerror(error), buffer_size);
void AppendV(const char* fmt, va_list args) {
int avail = kSize - pos_;
int ret = vsnprintf(buffer_ + pos_, kSize - pos_, fmt, args);
if (ret >= avail) {
pos_ = kSize - 1;
} else {
pos_ += ret;
}
}
// First, send to stderr.
fprintf(stderr, "%.*s", ret, buffer);
void Print() {
// First, send to stderr.
fprintf(stderr, "%.*s\n", pos_, buffer_);
#ifdef __ANDROID__
// Then to the Android log.
__android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer);
// Then to the Android log.
__android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer_);
#endif
}
::free(buffer);
}
private:
static constexpr int kSize = 4096;
int pos_ = 0;
char buffer_[kSize];
};
} // namespace
void Log(const char* fmt, ...) {
void Log(const char* location, const char* fmt, ...) {
int old_errno = errno;
va_list args;
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);
errno = old_errno;
}
void LogErrno(const char* fmt, ...) {
void LogErrno(const char* location, const char* fmt, ...) {
int old_errno = errno;
va_list args;
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);
errno = old_errno;
}
......
......@@ -31,11 +31,11 @@ namespace crazy {
#if CRAZY_DEBUG
void Log(const char* fmt, ...);
void LogErrno(const char* fmt, ...);
void Log(const char* location, const char* fmt, ...);
void LogErrno(const char* location, const char* fmt, ...);
#define LOG(...) ::crazy::Log(__VA_ARGS__)
#define LOG_ERRNO(...) ::crazy::LogErrno(__VA_ARGS__)
#define LOG(...) ::crazy::Log(__PRETTY_FUNCTION__, __VA_ARGS__)
#define LOG_ERRNO(...) ::crazy::LogErrno(__PRETTY_FUNCTION__, __VA_ARGS__)
#else
......
......@@ -76,11 +76,7 @@ bool ElfLoader::LoadAt(const char* lib_path,
off_t file_offset,
uintptr_t wanted_address,
Error* error) {
LOG("%s: lib_path='%s', file_offset=%p, load_address=%p\n",
__FUNCTION__,
lib_path,
file_offset,
LOG("lib_path='%s', file_offset=%p, load_address=%p", lib_path, file_offset,
wanted_address);
// Check that the load address is properly page-aligned.
......@@ -243,11 +239,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
if (wanted_load_address_) {
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
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);
if (start == MAP_FAILED) {
error->Format("Could not reserve %d bytes of address space",
......@@ -261,7 +257,7 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
}
reserved_start_ = start;
LOG("%s: reserved start=%p\n", __FUNCTION__, reserved_start_);
LOG("reserved start=%p", reserved_start_);
load_start_ = start;
load_bias_ = reinterpret_cast<ELF::Addr>(start) - min_vaddr;
......@@ -276,11 +272,11 @@ bool ElfLoader::ReserveAddressSpace(Error* error) {
load_start_ = reinterpret_cast<void*>(
reinterpret_cast<uintptr_t>(load_start_) + 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
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;
}
......@@ -364,11 +360,8 @@ bool ElfLoader::LoadSegments(Error* error) {
ELF::Addr file_page_start = PAGE_START(file_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",
__FUNCTION__,
file_offset_ + file_page_start,
file_length,
seg_page_start,
LOG("file_offset=%p file_length=%p start_address=%p end_address=%p",
file_offset_ + file_page_start, file_length, seg_page_start,
seg_page_start + PAGE_END(file_length));
if (file_length != 0) {
......
......@@ -330,7 +330,7 @@ bool ElfRelocations::Init(const ElfView* view, Error* error) {
bool ElfRelocations::ApplyAll(const ElfSymbols* symbols,
SymbolResolver* resolver,
Error* error) {
LOG("%s: Enter\n", __FUNCTION__);
LOG("Enter");
if (has_text_relocations_) {
if (phdr_table_unprotect_segments(phdr_, phdr_count_, load_bias_) < 0) {
......@@ -362,7 +362,7 @@ bool ElfRelocations::ApplyAll(const ElfSymbols* symbols,
}
}
LOG("%s: Done\n", __FUNCTION__);
LOG("Done");
return true;
}
......@@ -405,20 +405,18 @@ bool ElfRelocations::ForEachAndroidRelocationHelper(
while (rel_iterator.has_next()) {
const auto rel = rel_iterator.next();
if (rel == nullptr) {
LOG("%s: failed to parse relocation %d\n", __FUNCTION__,
relocations_handled);
LOG("failed to parse relocation %d", relocations_handled);
return false;
}
// Pass the relocation to the supplied handler function. If the handler
// returns false we view this as failure and return false to our caller.
if (!handler(this, rel, opaque)) {
LOG("%s: failed handling relocation %d\n", __FUNCTION__,
relocations_handled);
LOG("failed handling relocation %d", relocations_handled);
return false;
}
relocations_handled++;
}
LOG("%s: relocations_handled=%d\n", __FUNCTION__, relocations_handled);
LOG("relocations_handled=%d", relocations_handled);
return true;
}
......@@ -706,7 +704,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type,
if (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);
return true;
}
......@@ -718,7 +716,7 @@ bool ElfRelocations::ResolveSymbol(ELF::Word rel_type,
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:
// Libraries are not searched to resolve weak references.
......@@ -787,7 +785,7 @@ bool ElfRelocations::ApplyRelocs(const rel_t* rel,
const ElfSymbols* symbols,
SymbolResolver* resolver,
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)
return true;
......
......@@ -156,26 +156,23 @@ bool SharedRelro::InitFrom(size_t relro_start,
// Create temporary mapping of the ashmem region.
ScopedMemoryMapping fd_map;
LOG("%s: Entering addr=%p size=%p fd=%d\n",
__FUNCTION__,
(void*)relro_start,
(void*)relro_size,
LOG("Entering addr=%p size=%p fd=%d", (void*)relro_start, (void*)relro_size,
ashmem_fd);
// Sanity check: Ashmem file descriptor must be read-only.
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));
return false;
}
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));
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* fd_page = static_cast<char*>(fd_map.Get());
......@@ -197,10 +194,7 @@ bool SharedRelro::InitFrom(size_t relro_start,
if (p2 > p) {
// Swap pages between |pos| and |pos2|.
LOG("%s: Swap pages at %p-%p\n",
__FUNCTION__,
cur_page + p,
cur_page + p2);
LOG("Swap pages at %p-%p", cur_page + p, cur_page + p2);
if (!SwapPagesFromFd(cur_page + p, p2 - p, ashmem_fd, p, error))
return false;
......@@ -210,11 +204,8 @@ bool SharedRelro::InitFrom(size_t relro_start,
p = p2;
} while (p < size);
LOG("%s: Swapped %d pages over %d (%d %%, %d KB not shared)\n",
__FUNCTION__,
similar_size / PAGE_SIZE,
size / PAGE_SIZE,
similar_size * 100 / size,
LOG("Swapped %d pages over %d (%d %%, %d KB not shared)",
similar_size / PAGE_SIZE, size / PAGE_SIZE, similar_size * 100 / size,
(size - similar_size) / 4096);
if (similar_size == 0) {
......
......@@ -27,13 +27,13 @@ unsigned ElfHash(const char* name) {
} // namespace
bool ElfSymbols::Init(const ElfView* view) {
LOG("%s: Parsing dynamic table\n", __FUNCTION__);
LOG("Parsing dynamic table");
ElfView::DynamicIterator dyn(view);
for (; dyn.HasNext(); dyn.GetNext()) {
uintptr_t dyn_addr = dyn.GetAddress(view->load_bias());
switch (dyn.GetTag()) {
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);
hash_bucket_size_ = data[0];
......@@ -43,11 +43,11 @@ bool ElfSymbols::Init(const ElfView* view) {
}
break;
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);
break;
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);
break;
default:
......
......@@ -98,22 +98,15 @@ bool ElfView::InitUnmapped(ELF::Addr load_address,
phdr_ = phdr0;
phdr_count_ = phdr_count;
LOG("%s: 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",
__FUNCTION__,
load_address_,
load_size_,
load_bias_,
phdr_,
phdr_count_,
dynamic_,
dynamic_count_,
dynamic_flags_);
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",
load_address_, load_size_, load_bias_, phdr_, phdr_count_, dynamic_,
dynamic_count_, dynamic_flags_);
return true;
}
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) {
error->Format("Can't enable GNU RELRO protection: %s", strerror(errno));
......
......@@ -17,7 +17,7 @@ void Error::Set(const char* message) {
message = "";
strlcpy(buff_, message, sizeof(buff_));
LOG("--- ERROR: %s\n", buff_);
LOG("--- ERROR: %s", buff_);
}
void Error::Append(const char* message) {
......@@ -25,7 +25,7 @@ void Error::Append(const char* message) {
return;
strlcat(buff_, message, sizeof(buff_));
LOG("--- ERROR: %s\n", buff_);
LOG("--- ERROR: %s", buff_);
}
void Error::Format(const char* fmt, ...) {
......@@ -34,7 +34,7 @@ void Error::Format(const char* fmt, ...) {
vsnprintf(buff_, sizeof(buff_), fmt, args);
va_end(args);
LOG("--- ERROR: %s\n", buff_);
LOG("--- ERROR: %s", buff_);
}
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);
va_end(args);
LOG("--- ERROR: %s\n", buff_);
LOG("--- ERROR: %s", buff_);
}
} // namespace crazy
......@@ -105,7 +105,7 @@ void LibraryList::LoadPreloads() {
SearchPathList search_path_list;
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* end = ld_preload + strlen(ld_preload);
......@@ -121,10 +121,10 @@ void LibraryList::LoadPreloads() {
current = item + item_length + 1;
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())) {
LOG("%s: already loaded %s: ignoring\n", __FUNCTION__, lib_name.c_str());
LOG("already loaded %s: ignoring", lib_name.c_str());
continue;
}
......@@ -145,7 +145,7 @@ void LibraryList::LoadPreloads() {
}
if (CRAZY_DEBUG) {
LOG("%s: Preloads loaded\n", __FUNCTION__);
LOG("Preloads loaded");
for (size_t n = 0; n < preloaded_libraries_.GetCount(); ++n)
LOG(" ... %p %s\n",
preloaded_libraries_[n], preloaded_libraries_[n]->GetName());
......@@ -263,10 +263,7 @@ int LibraryList::IteratePhdr(PhdrIterationCallback callback, void* data) {
void LibraryList::UnloadLibrary(LibraryView* wrap) {
// Sanity check.
LOG("%s: for %s (ref_count=%d)\n",
__FUNCTION__,
wrap->GetName(),
wrap->ref_count());
LOG("for %s (ref_count=%d)", wrap->GetName(), wrap->ref_count());
if (!wrap->IsSystem() && !wrap->IsCrazy())
return;
......@@ -318,7 +315,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
Error* error) {
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
// already loaded.
......@@ -348,7 +345,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
// normally with dlopen() and do not proceed to try and load the library
// crazily.
if (is_dependency_or_preload) {
LOG("%s: Loading system library '%s'\n", __FUNCTION__, lib_name);
LOG("Loading system library '%s'", lib_name);
::dlerror();
void* system_lib = dlopen(lib_name, dlopen_mode);
if (!system_lib) {
......@@ -360,7 +357,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
wrap->SetSystem(system_lib, lib_name);
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());
return wrap;
}
......@@ -371,7 +368,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
String full_path;
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);
if (!path) {
error->Format("Can't find library file %s", lib_name);
......@@ -389,7 +386,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
// Absolute path. Easy.
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())) {
error->Format("Library file doesn't exist: %s", full_path.c_str());
return NULL;
......@@ -401,7 +398,7 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
return NULL;
// 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());
Vector<LibraryView*> dependencies;
while (iter.GetNext()) {
......@@ -420,14 +417,14 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
dependencies.PushBack(dependency);
}
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)
LOG(" ... %p %s\n", dependencies[n], dependencies[n]->GetName());
LOG(" dependencies @%p\n", &dependencies);
}
// Relocate the library.
LOG("%s: Relocating %s\n", __FUNCTION__, base_name);
LOG("Relocating %s", base_name);
if (!lib->Relocate(this, &preloaded_libraries_, &dependencies, error))
return NULL;
......@@ -451,12 +448,12 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name,
wrap->SetCrazy(lib.Get(), lib_name);
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.
lib->CallConstructors();
LOG("%s: Done loading %s\n", __FUNCTION__, base_name);
LOG("Done loading %s", base_name);
lib.Release();
return wrap;
......
......@@ -12,7 +12,7 @@
namespace crazy {
LibraryView::~LibraryView() {
LOG("%s: Destroying %s\n", __FUNCTION__, name_.c_str());
LOG("Destroying %s", name_.c_str());
if (type_ == TYPE_SYSTEM) {
::dlclose(system_);
system_ = NULL;
......
......@@ -44,11 +44,8 @@ bool LineReader::GetNextLine() {
line_len_ = 0;
for (;;) {
LLOG("%s: LOOP line_start=%d buff_size=%d buff_capacity=%d\n",
__FUNCTION__,
line_start_,
buff_size_,
buff_capacity_);
LLOG("LOOP line_start=%d buff_size=%d buff_capacity=%d", line_start_,
buff_size_, buff_capacity_);
// Find the end of the current line in the current buffer. The result
// of memchr(_,_,0) is undefined, treated as not-found.
......@@ -62,12 +59,8 @@ bool LineReader::GetNextLine() {
if (line_end != NULL) {
// Found one, return it directly.
line_len_ = static_cast<size_t>(line_end + 1 - line);
LLOG("%s: LINE line_start=%d line_len=%d '%.*s'\n",
__FUNCTION__,
line_start_,
line_len_,
line_len_,
buff_ + line_start_);
LLOG("LINE line_start=%d line_len=%d '%.*s'\n", line_start_, line_len_,
line_len_, buff_ + line_start_);
return true;
}
......@@ -76,7 +69,7 @@ bool LineReader::GetNextLine() {
::memmove(buff_, buff_ + line_start_, buff_size_ - line_start_);
buff_size_ -= line_start_;
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.
......@@ -87,15 +80,11 @@ bool LineReader::GetNextLine() {
if (buff_size_ > 0 && buff_size_ < buff_capacity_) {
buff_[buff_size_++] = '\n';
line_len_ = buff_size_;
LLOG("%s: EOF_LINE buff_size=%d '%.*s'\n",
__FUNCTION__,
buff_size_,
buff_size_,
buff_);
LLOG("EOF_LINE buff_size=%d '%.*s'\n", buff_size_, buff_size_, buff_);
return true;
}
// Otherwise, ignore the last line.
LLOG("%s: EOF\n", __FUNCTION__);
LLOG("EOF");
return false;
}
......@@ -104,23 +93,15 @@ bool LineReader::GetNextLine() {
buff_capacity_ *= 2;
buff_ = static_cast<char*>(::realloc(buff_, buff_capacity_));
LLOG("%s: GROW buff_size=%d buff_capacity=%d '%.*s'\n",
__FUNCTION__,
buff_size_,
buff_capacity_,
buff_size_,
buff_);
LLOG("GROW buff_size=%d buff_capacity=%d '%.*s'\n", buff_size_,
buff_capacity_, buff_size_, buff_);
}
// Try to fill the rest of buffer after current content.
size_t avail = buff_capacity_ - buff_size_;
int ret = fd_.Read(buff_ + buff_size_, avail);
LLOG("%s: READ buff_size=%d buff_capacity=%d avail=%d ret=%d\n",
__FUNCTION__,
buff_size_,
buff_capacity_,
avail,
ret);
LLOG("READ buff_size=%d buff_capacity=%d avail=%d ret=%d\n", buff_size_,
buff_capacity_, avail, ret);
if (ret <= 0) {
eof_ = true;
ret = 0;
......
......@@ -229,11 +229,11 @@ bool FindElfBinaryForAddress(void* address,
if (entry.vma_start <= addr && addr < entry.vma_end) {
*load_address = entry.vma_start;
if (!entry.path) {
LOG("Could not find ELF binary path!?\n");
LOG("Could not find ELF binary path!?");
return false;
}
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;
}
memcpy(path_buffer, entry.path, entry.path_len);
......
......@@ -36,7 +36,7 @@ const char* SearchPathList::FindFile(const char* file_name) {
if (!file_name || !*file_name)
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.
String full_list = list_;
......@@ -71,10 +71,10 @@ const char* SearchPathList::FindFile(const char* file_name) {
full_path_ += file_name;
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();
} else
LOG(" skip %s\n", full_path_.c_str());
LOG(" skip %s", full_path_.c_str());
}
return NULL;
......
......@@ -82,7 +82,7 @@ typedef void (*JNI_OnUnloadFunctionPtr)(void* vm, void* reserved);
void CallFunction(linker_function_t func, const char* func_type) {
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))
func();
}
......@@ -124,7 +124,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver {
// https://code.google.com/p/android/issues/detail?id=74255
for (size_t n = 0; n < preloads_->GetCount(); ++n) {
LibraryView* wrap = (*preloads_)[n];
// LOG("%s: Looking into preload %p (%s)\n", __FUNCTION__, wrap,
// LOG("Looking into preload %p (%s)", wrap,
// wrap->GetName());
address = LookupInWrap(symbol_name, wrap);
if (address)
......@@ -139,7 +139,7 @@ class SharedLibraryResolver : public ElfRelocations::SymbolResolver {
// Then look inside the dependencies.
for (size_t n = 0; n < dependencies_->GetCount(); ++n) {
LibraryView* wrap = (*dependencies_)[n];
// LOG("%s: Looking into dependency %p (%s)\n", __FUNCTION__, wrap,
// LOG("Looking into dependency %p (%s)", wrap,
// wrap->GetName());
address = LookupInWrap(symbol_name, wrap);
if (address)
......@@ -208,7 +208,7 @@ bool SharedLibrary::Load(const char* full_path,
size_t file_offset,
Error* error) {
// 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);
if (full_path_len >= sizeof(full_path_)) {
......@@ -220,7 +220,7 @@ bool SharedLibrary::Load(const char* full_path,
base_name_ = GetBaseNamePtr(full_path_);
// 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;
......@@ -251,12 +251,12 @@ bool SharedLibrary::Load(const char* full_path,
}
#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(
phdr(), phdr_count(), load_bias(), &arm_exidx_, &arm_exidx_count_);
#endif
LOG("%s: Parsing dynamic table for %s\n", __FUNCTION__, base_name_);
LOG("Parsing dynamic table for %s", base_name_);
ElfView::DynamicIterator dyn(&view_);
for (; dyn.HasNext(); dyn.GetNext()) {
ELF::Addr dyn_value = dyn.GetValue();
......@@ -269,45 +269,42 @@ bool SharedLibrary::Load(const char* full_path,
}
break;
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);
break;
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);
break;
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);
break;
case DT_INIT_ARRAYSZ:
init_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_INIT_ARRAYSZ value=%p count=%p\n",
dyn_value,
LOG(" DT_INIT_ARRAYSZ value=%p count=%p", dyn_value,
init_array_count_);
break;
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);
break;
case DT_FINI_ARRAYSZ:
fini_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_FINI_ARRAYSZ value=%p count=%p\n",
dyn_value,
LOG(" DT_FINI_ARRAYSZ value=%p count=%p", dyn_value,
fini_array_count_);
break;
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);
break;
case DT_PREINIT_ARRAYSZ:
preinit_array_count_ = dyn_value / sizeof(ELF::Addr);
LOG(" DT_PREINIT_ARRAYSZ value=%p count=%p\n",
dyn_value,
LOG(" DT_PREINIT_ARRAYSZ value=%p count=%p", dyn_value,
preinit_array_count_);
break;
case DT_SYMBOLIC:
LOG(" DT_SYMBOLIC\n");
LOG(" DT_SYMBOLIC");
has_DT_SYMBOLIC_ = true;
break;
case DT_FLAGS:
......@@ -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;
}
......@@ -334,7 +331,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list,
Vector<LibraryView*>* dependencies,
Error* error) {
// Apply relocations.
LOG("%s: Applying relocations to %s\n", __FUNCTION__, base_name_);
LOG("Applying relocations to %s", base_name_);
ElfRelocations relocations;
......@@ -345,7 +342,7 @@ bool SharedLibrary::Relocate(LibraryList* lib_list,
if (!relocations.ApplyAll(&symbols_, &resolver, error))
return false;
LOG("%s: Relocations applied for %s\n", __FUNCTION__, base_name_);
LOG("Relocations applied for %s", base_name_);
return true;
}
......@@ -394,11 +391,8 @@ bool SharedLibrary::UseSharedRelro(size_t relro_start,
size_t relro_size,
int relro_fd,
Error* error) {
LOG("%s: relro_start=%p relro_size=%p relro_fd=%d\n",
__FUNCTION__,
(void*)relro_start,
(void*)relro_size,
relro_fd);
LOG("relro_start=%p relro_size=%p relro_fd=%d", (void*)relro_start,
(void*)relro_size, relro_fd);
if (relro_fd < 0 || relro_size == 0) {
// Nothing to do here.
......
......@@ -74,8 +74,7 @@ class ScopedMMap {
ScopedMMap(void* mem, uint32_t len) : mem_(mem), len_(len) {}
~ScopedMMap() {
if (munmap(mem_, len_) == -1) {
LOG_ERRNO("%s: munmap failed when trying to unmap zip file\n",
__FUNCTION__);
LOG_ERRNO("munmap failed when trying to unmap zip file");
}
}
private:
......@@ -107,30 +106,26 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
// Open the file
FileDescriptor fd;
if (!fd.OpenReadOnly(zip_file)) {
LOG_ERRNO("%s: open failed trying to open zip file %s\n",
__FUNCTION__, zip_file);
LOG_ERRNO("open failed trying to open zip file %s", zip_file);
return CRAZY_OFFSET_FAILED;
}
// Find the length of the file.
struct stat stat_buf;
if (stat(zip_file, &stat_buf) == -1) {
LOG_ERRNO("%s: stat failed trying to stat zip file %s\n",
__FUNCTION__, zip_file);
LOG_ERRNO("stat failed trying to stat zip file %s", zip_file);
return CRAZY_OFFSET_FAILED;
}
if (stat_buf.st_size > kMaxZipFileLength) {
LOG("%s: The size %ld of %s is too large to map\n",
__FUNCTION__, stat_buf.st_size, zip_file);
LOG("The size %ld of %s is too large to map", stat_buf.st_size, zip_file);
return CRAZY_OFFSET_FAILED;
}
// Map the file into memory.
void* mem = fd.Map(NULL, stat_buf.st_size, PROT_READ, MAP_PRIVATE, 0);
if (mem == MAP_FAILED) {
LOG_ERRNO("%s: mmap failed trying to mmap zip file %s\n",
__FUNCTION__, zip_file);
LOG_ERRNO("mmap failed trying to mmap zip file %s", zip_file);
return CRAZY_OFFSET_FAILED;
}
ScopedMMap scoped_mmap(mem, stat_buf.st_size);
......@@ -147,8 +142,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
}
}
if (off == -1) {
LOG("%s: Failed to find end of central directory in %s\n",
__FUNCTION__, zip_file);
LOG("Failed to find end of central directory in %s", zip_file);
return CRAZY_OFFSET_FAILED;
}
......@@ -161,15 +155,15 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
mem_bytes, off + kOffsetOfStartOfCentralDirInEndOfCentralDirectory);
if (start_of_central_dir > off) {
LOG("%s: Found out of range offset %u for start of directory in %s\n",
__FUNCTION__, start_of_central_dir, zip_file);
LOG("Found out of range offset %u for start of directory in %s",
start_of_central_dir, zip_file);
return CRAZY_OFFSET_FAILED;
}
uint32_t end_of_central_dir = start_of_central_dir + length_of_central_dir;
if (end_of_central_dir > off) {
LOG("%s: Found out of range offset %u for end of directory in %s\n",
__FUNCTION__, end_of_central_dir, zip_file);
LOG("Found out of range offset %u for end of directory in %s",
end_of_central_dir, zip_file);
return CRAZY_OFFSET_FAILED;
}
......@@ -183,8 +177,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
for (; n < num_entries && off < end_of_central_dir; ++n) {
uint32_t marker = ReadUInt32(mem_bytes, off);
if (marker != kCentralDirHeaderMarker) {
LOG("%s: Failed to find central directory header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__,
LOG("Failed to find central directory header marker in %s. "
"Found 0x%x but expected 0x%x",
zip_file, marker, kCentralDirHeaderMarker);
return CRAZY_OFFSET_FAILED;
}
......@@ -208,8 +202,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
// Filename matches. Read the local header and compute the offset.
uint32_t marker = ReadUInt32(mem_bytes, local_header_offset);
if (marker != kLocalHeaderMarker) {
LOG("%s: Failed to find local file header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__,
LOG("Failed to find local file header marker in %s. "
"Found 0x%x but expected 0x%x",
zip_file, marker, kLocalHeaderMarker);
return CRAZY_OFFSET_FAILED;
}
......@@ -219,8 +213,8 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
mem_bytes,
local_header_offset + kOffsetCompressionMethodInLocalHeader);
if (compression_method != kCompressionMethodStored) {
LOG("%s: %s is compressed within %s. "
"Found compression method %u but expected %u\n", __FUNCTION__,
LOG("%s is compressed within %s. "
"Found compression method %u but expected %u",
filename, zip_file, compression_method, kCompressionMethodStored);
return CRAZY_OFFSET_FAILED;
}
......@@ -243,16 +237,17 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
}
if (n < num_entries) {
LOG("%s: Did not find all the expected entries in the central directory. "
"Found %d but expected %d\n", __FUNCTION__, n, num_entries);
LOG("Did not find all the expected entries in the central directory. "
"Found %d but expected %d",
n, num_entries);
}
if (off < end_of_central_dir) {
LOG("%s: There are %d extra bytes at the end of the central directory.\n",
__FUNCTION__, end_of_central_dir - off);
LOG("There are %d extra bytes at the end of the central directory.",
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;
}
......
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