diff options
author | Ryan Prichard <rprichard@google.com> | 2018-10-01 23:10:05 -0700 |
---|---|---|
committer | Ryan Prichard <rprichard@google.com> | 2018-10-10 14:31:06 -0700 |
commit | 8f639a40966c630c64166d2657da3ee641303194 (patch) | |
tree | 96e03d65a4efa6613941b748ed2c11b64a8dec1b /linker/linker_logger.cpp | |
parent | cb8ed207d2bb6113a80fc7f27cd0beb8897f5192 (diff) |
Allow invoking the linker on an executable.
The executable can be inside a zip file using the same syntax used for
shared objects: path.zip!/libentry.so.
The linker currently requires an absolute path. This restriction could be
loosened, but it didn't seem important? If it allowed non-absolute paths,
we'd need to decide how to handle:
- foo/bar (relative to CWD?)
- foo (search PATH / LD_LIBRARY_PATH, or also relative to CWD?)
- foo.zip!/bar (normalize_path() requires an absolute path)
The linker adjusts the argc/argv passed to main() and to constructor
functions to hide the initial linker argument, but doesn't adjust the auxv
vector or files like /proc/self/{exe,cmdline,auxv,stat}. Those files will
report that the kernel loaded the linker as an executable.
I think the linker_logger.cpp change guarding against (g_argv == NULL)
isn't actually necessary, but it seemed like a good idea given that I'm
delaying initialization of g_argv until after C++ constructors have run.
Bug: http://b/112050209
Test: bionic unit tests
Change-Id: I846faf98b16fd34218946f6167e8b451897debe5
Diffstat (limited to 'linker/linker_logger.cpp')
-rw-r--r-- | linker/linker_logger.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/linker/linker_logger.cpp b/linker/linker_logger.cpp index 4c6603b6a..d0e507218 100644 --- a/linker/linker_logger.cpp +++ b/linker/linker_logger.cpp @@ -106,8 +106,8 @@ void LinkerLogger::ResetState() { static CachedProperty debug_ld_all("debug.ld.all"); flags_ |= ParseProperty(debug_ld_all.Get()); - // Ignore processes started without argv (http://b/33276926). - if (g_argv[0] == nullptr) { + // Safeguard against a NULL g_argv. Ignore processes started without argv (http://b/33276926). + if (g_argv == nullptr || g_argv[0] == nullptr) { return; } |