)]}'
{
  "log": [
    {
      "commit": "339ecef22d17748ae7c289d974a59b97484f6896",
      "tree": "504ddd62b1551ca5fe9296e631d08977a24fcede",
      "parents": [
        "a04764bd286cf86f28d65487e1b6d6d36c9671e8"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Jan 02 16:36:06 2020 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Jan 13 13:29:25 2020 -0800"
      },
      "message": "Optimize GNU hash linking for large inputs\n\nSymbol lookup is O(L) where L is the number of libraries to search (e.g.\nin the global and local lookup groups). Factor out the per-DSO work into\nsoinfo_do_lookup_impl, and optimize for the situation where all the DSOs\nare using DT_GNU_HASH (rather than SysV hashes).\n\nTo load a set of libraries, the loader first constructs an auxiliary list\nof libraries (SymbolLookupList, containing SymbolLookupLib objects). The\nSymbolLookupList is reused for each DSO in a load group. (-Bsymbolic is\naccommodated by modifying the SymbolLookupLib at the front of the list.)\nTo search for a symbol, soinfo_do_lookup_impl has a small loop that first\nscans a vector of GNU bloom filters looking for a possible match.\n\nThere was a slight improvement from templatizing soinfo_do_lookup_impl\nand skipping the does-this-DSO-lack-GNU-hash check.\n\nRewrite the relocation processing loop to be faster. There are specialized\nfunctions that handle the expected relocation types in normal relocation\nsections and in PLT relocation sections.\n\nThis CL can reduce the initial link time of large programs by around\n40-50% (e.g. audioserver, cameraserver, etc). On the linker relocation\nbenchmark (64-bit walleye), it reduces the time from 131.6ms to 71.9ms.\n\nBug: http://b/143577578 (incidentally fixed by this CL)\nTest: bionic-unit-tests\nChange-Id: If40a42fb6ff566570f7280b71d58f7fa290b9343\n"
    },
    {
      "commit": "94a8e859edbd6b470699210eea8712e75fd97f79",
      "tree": "373eb2fb8139055d2f628fb9488d37941dabfbd6",
      "parents": [
        "249757bae2b45c845feddee2ba9f794a54d8ea14"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Nov 05 14:19:18 2019 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Nov 05 14:56:09 2019 -0800"
      },
      "message": "linker: avoid -O0 memset while clearing temp_tcb\n\nWith -O0, on arm64, Clang uses memset for this declaration:\n\n    bionic_tcb temp_tcb \u003d {};\n\narm64 doesn\u0027t currently have an ifunc for memset, but if it did, then this\nline would crash when the linker is compiled with -O0. It looks like other\narchitectures would only use a memset call if the bionic_tcb struct were\nlarger.\n\nAvoid memset by using a custom memclr function that the compiler optimizes\ninto something efficient.\n\nAlso add __attribute__((uninitialized)) to ensure that\n-ftrivial-auto-var-init does not generate a call to memset. See this\nchange[1] in build/soong.\n\n[1] If085ec53c619e2cebc86ca23f7039298160d99ae\n\nTest: build linker with -O0, linker[64] --help works\nBug: none\nChange-Id: I0df8065a362646de4fa021cae63a7d68ca3966b6\n"
    },
    {
      "commit": "249757bae2b45c845feddee2ba9f794a54d8ea14",
      "tree": "5e727eef8f9a29cbf52516b119c407cbfb7cb3a8",
      "parents": [
        "80e40f01c83850d8d5f9753ed165bab310f9c865"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Nov 01 17:18:28 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Nov 05 13:37:51 2019 -0800"
      },
      "message": "Use ifuncs in the linker\n\nUsing ifuncs allows the linker to select faster versions of libc functions\nlike strcmp, making linking faster.\n\nThe linker continues to first initialize TLS, then call the ifunc\nresolvers. There are small amounts of code in Bionic that need to avoid\ncalling functions selected using ifuncs (generally string.h APIs). I\u0027ve\ntried to compile those pieces with -ffreestanding. Maybe it\u0027s unnecessary,\nbut maybe it could help avoid compiler-inserted memset calls, and maybe\nit will be useful later on.\n\nThe ifuncs are called in a special early pass using special\n__rel[a]_iplt_start / __rel[a]_iplt_end symbols. The linker will encounter\nthe ifuncs again as R_*_IRELATIVE dynamic relocations, so they\u0027re skipped\non the second pass.\n\nBreak linker_main.cpp into its own liblinker_main library so it can be\ncompiled with -ffreestanding.\n\nOn walleye, this change fixes a recent 2.3% linker64 start-up time\nregression (156.6ms -\u003e 160.2ms), but it also helps the 32-bit time by\nabout 1.9% on the same benchmark. I\u0027m measuring the run-time using a\nsynthetic benchmark based on loading libandroid_servers.so.\n\nTest: bionic unit tests, manual benchmarking\nBug: none\nMerged-In: Ieb9446c2df13a66fc0d377596756becad0af6995\nChange-Id: Ieb9446c2df13a66fc0d377596756becad0af6995\n(cherry picked from commit 772bcbb0c2f7a87b18021849528240ef0c617d94)\n"
    },
    {
      "commit": "80e40f01c83850d8d5f9753ed165bab310f9c865",
      "tree": "489b8087ad82fc1439c71c026d90c4fb3cac6ff5",
      "parents": [
        "5d9ba9ea702a4d20b99639996b8bd27f121d5bd7"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Oct 31 19:54:46 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Nov 05 13:37:29 2019 -0800"
      },
      "message": "Refactor linker/Android.bp for native-bridge\n\nDefine a \"linker_bin_template\" cc_defaults module that a native bridge\nimplementation can inherit to define a guest linker.\n\nBreak the debuggerd_init call off into separate\nlinker_debuggerd_{android,stub}.cpp files to allow opting in/out of the\ndebuggerd integration without needing to change how linker_main.cpp is\ncompiled. (This is necessary for a later commit that moves\nlinker_main.cpp into a new static library.)\n\nTest: bionic unit tests\nBug: none\nMerged-In: I7c5d79281bce1e69817b266dd91d43ea40f78522\nChange-Id: I7c5d79281bce1e69817b266dd91d43ea40f78522\n(cherry picked from commit 5adf402ee9d65c803b71d93b9e3de77b36ccb027)\n"
    },
    {
      "commit": "78cd2834807c0fbf5788b68ba96675ef79dd5920",
      "tree": "bc9758f869562e073a260283cfc4bf509944a400",
      "parents": [
        "04f27f23dc23b9d7924904161dac37266b42d660"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Oct 25 17:46:43 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Oct 25 17:46:43 2019 -0700"
      },
      "message": "linker: remove COUNT_PAGES\n\nCOUNT_PAGES tries to count the pages dirtied by relocations, but this\nimplementation is broken because it\u0027s merging rel-\u003er_offset values from\nmultiple DSOs. The functionality is hard to use, because it requires\nrebuilding the linker, and it\u0027s not obvious to me that it should belong\nin the linker. If we do want it, we should make it work without rebuilding\nthe linker.\n\nSimilar information can currently be collected by parsing the result of\n`readelf -r` on a binary (or a set of binaries).\n\nBug: none\nTest: m linker libc com.android.runtime ; adb sync ; run something\nChange-Id: I760fb6ea4ea3d1927eb5145cdf4ca133851d69b4\n"
    },
    {
      "commit": "1bf62b24abdba18985217efeee907be8de4121f0",
      "tree": "e315d7d725bccaeb4751a4553f53a5e1d8345f91",
      "parents": [
        "6864fc8d065f647b56297e71d928aab0800d0879"
      ],
      "author": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Tue Aug 13 14:53:28 2019 -0700"
      },
      "committer": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Wed Aug 14 13:52:48 2019 -0700"
      },
      "message": "linker: Set VMA name for bss sections\n\nThe linker currently sets VMA name \".bss\" for bss sections in DSOs\nloaded by the linker.  With this change, the linker now also sets VMA\nname for bss sections in the linker itself and the main executable, so\nthat they don\u0027t get left out in various accounting.\n\nTest: Run \u0027dd\u0027 and check its /proc/\u003cpid\u003e/maps.\nChange-Id: I62d9996ab256f46e2d82cac581c17fa94836a228\n"
    },
    {
      "commit": "542db792dc3ad9dd73a1c22c031c16c2a3c85690",
      "tree": "ee23a63bb39ca1e5c2c372005b889464d7466bca",
      "parents": [
        "d5c0a508bc02da51899fde9f20f7b91fd6f9cb89"
      ],
      "author": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Thu Jul 25 10:39:27 2019 -0700"
      },
      "committer": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Thu Jul 25 10:39:27 2019 -0700"
      },
      "message": "Fix linker compilation when STATS is set\n\nTest: Compiles with STATS set in linker_debug.h\nChange-Id: I8ea6ca9a61ad316473dab51999885008f2721cee\n"
    },
    {
      "commit": "cf9ed12d107c05acfec5a4fbf70c416bfd34a2b3",
      "tree": "11ab821a3d69569a9b24707e63aafed48a67a187",
      "parents": [
        "c3c492965995a2bd5cfe12846f5038c4d7d2c91e"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Jun 04 20:56:56 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Jun 05 18:02:40 2019 -0700"
      },
      "message": "Use PT_INTERP as the linker\u0027s l_name path\n\nOrdinary executables have a PT_INTERP path of /system/bin/linker[64], but:\n - executables using bootstrap Bionic use /system/bin/bootstrap/linker[64]\n - ASAN executables use /system/bin/linker_asan[64]\n\ngdb appears to use the PT_INTERP path for debugging the dynamic linker\nbefore the linker has initialized the r_debug module list. If the linker\u0027s\nl_name differs from PT_INTERP, then gdb assumes that the linker has been\nunloaded and searches for a new solib using the linker\u0027s l_name path.\n\ngdb may print a warning like:\n\nwarning: Temporarily disabling breakpoints for unloaded shared library \"$OUT/symbols/system/bin/linker64\"\n\nIf I\u0027m currently debugging the linker when this happens, gdb apparently\ndoesn\u0027t load debug symbols for the linker. This can be worked around with\ngdb\u0027s \"sharedlibrary\" command, but it\u0027s better to avoid it.\n\nPreviously, when PT_INTERP was the bootstrap linker, but l_name was\n\"/system/bin/linker[64]\", gdb would find the default non-bootstrap linker\nbinary and (presumably) get confused about symbol addresses.\n\n(Also, remove the \"static std::string exe_path\" variable because the\nsoinfo::realpath_ field is a std::string that already lasts until exit. We\nalready use it for link_map_head.l_name in notify_gdb_of_load.)\n\nBug: http://b/134183407\nTest: manual\nChange-Id: I9a95425a3a5e9fd01e9dd272273c6ed3667dbb9a\n"
    },
    {
      "commit": "90f96b9f483b8effefd6a6fe8a8f0562f616837e",
      "tree": "79681d6b86ab2c8c211bf5e39f91a1bf73d6bc95",
      "parents": [
        "81063190064ce84aee135a52b16f53cce50b950a"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 09 15:56:39 2019 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 09 22:12:17 2019 -0700"
      },
      "message": "linker: support ldd(1)-like behavior via --list.\n\nGiven that we have both linker and linker64, I didn\u0027t really want to have\nto have ldd and ldd64, so this change just adds the --list option to the\nlinkers and a shell script wrapper \"ldd\" that calls the appropriate\nlinker behind the scenes.\n\nTest: adb shell linker --list `which app_process32`\nTest: adb shell linker64 --list `which date`\nTest: adb shell ldd `which app_process32`\nTest: adb shell ldd `which date`\nChange-Id: I33494bda1cc3cafee54e091f97c0f2ae52d1f74b\n"
    },
    {
      "commit": "7b9db347ae24008373a5e2030d7b1971fe8f9d61",
      "tree": "09feb9f96c0fb05713925f26fb66e30f24a1ec9c",
      "parents": [
        "21cf101f5491400349fa1126ff31247513c25dab"
      ],
      "author": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Tue Apr 16 14:54:58 2019 -0700"
      },
      "committer": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Tue Apr 16 14:54:58 2019 -0700"
      },
      "message": "Fix linker compilation with timing enabled\n\nTest: Build with TIMING set to 1 in linker_debug.h.\nChange-Id: Ia11021f6221bc985abddb379e813e4e353fd7149\n"
    },
    {
      "commit": "95252eedf32f38b22784ba6f1097f25d485652f5",
      "tree": "e76a8f7fef10ad78fed7fee7c85e1756f84edcb9",
      "parents": [
        "0ab20442e49316899050d3af72257d5f483761d0"
      ],
      "author": {
        "name": "Martin Stjernholm",
        "email": "mast@google.com",
        "time": "Fri Feb 22 22:48:59 2019 +0000"
      },
      "committer": {
        "name": "Martin Stjernholm",
        "email": "mast@google.com",
        "time": "Tue Mar 19 14:03:18 2019 +0000"
      },
      "message": "Add more linker debug.\n\n- Show which executable is being linked, which linker config file is\n  being read, and which section in it is being used with, enabled on\n  $LD_DEBUG\u003e\u003d1.\n\n- Show more info to follow the dlopen() process, enabled with \"dlopen\"\n  in the debug.ld.xxx property.\n\nTest: Flash, boot, and look at logcat after \"adb shell setprop debug.ld.all dlopen\"\nBug: 120430775\nChange-Id: I5441c8ced26ec0e2f04620c3d2a1ae860b792154\n"
    },
    {
      "commit": "7cdbd0d477176e0973beb7328e40c328aa73d1e5",
      "tree": "6de43a0fb91dd75eb0eb89f4a003b32e6e8e3c0d",
      "parents": [
        "b656d4a1da35eac817950f906ce1c26259c05e82",
        "efbe9a5eefce28db6d1dbba18c212eb45915cf78"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Thu Feb 21 16:06:17 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Feb 21 16:06:17 2019 +0000"
      },
      "message": "Merge \"linker: allow using reserved space for multiple libraries.\""
    },
    {
      "commit": "efbe9a5eefce28db6d1dbba18c212eb45915cf78",
      "tree": "0e35795b7b52bc65af89143af0662b5b0f4ce3e1",
      "parents": [
        "73ee7a6320024c8f390d954a01b7a067c919bfc4"
      ],
      "author": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Wed Oct 17 15:59:38 2018 -0400"
      },
      "committer": {
        "name": "Torne (Richard Coles)",
        "email": "torne@google.com",
        "time": "Wed Feb 20 17:29:36 2019 -0500"
      },
      "message": "linker: allow using reserved space for multiple libraries.\n\nIntroduce a new flag ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE which\ninstructs the linker to use the reserved address space to load all of\nthe newly-loaded libraries required by a dlopen() call instead of only\nthe main library. They will be loaded consecutively into that region if\nthey fit. The RELRO sections of all the loaded libraries will also be\nconsidered for reading/writing shared RELRO data.\n\nThis will allow the WebView implementation to potentially consist of\nmore than one .so file while still benefiting from the RELRO sharing\noptimisation, which would otherwise only apply to the \"root\" .so file.\n\nTest: bionic-unit-tests (existing and newly added)\nBug: 110790153\nChange-Id: I61da775c29fd5017d9a1e2b6b3757c3d20a355b3\n"
    },
    {
      "commit": "1990ba5601f5230851d1e2112c28bebbf78c3f40",
      "tree": "89ac1bae3d31e58b42324787a2bf038ffe0b59f4",
      "parents": [
        "f827d82cdde0fe7f11015fb5ead39bac861ab6bd"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Feb 07 21:31:31 2019 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Feb 07 21:48:42 2019 -0800"
      },
      "message": "Fix linker self-exec detection\n\nWhen the linker is invoked on itself, (`linker64 /system/bin/linker64`),\nthe linker prints an error, because self-invocation isn\u0027t allowed. The\ncurrent method for detecting self-invocation fails because the second\nlinker instance can crash in a constructor function before reaching\n__linker_init.\n\nFix the problem by moving the error check into a constructor function,\nwhich finishes initializing libc sufficiently to call async_safe_fatal.\nThe only important thing missing is __libc_sysinfo on 32-bit x86. The aux\nvector isn\u0027t readily accessible, so use the fallback int 0x80.\n\nBug: http://b/123637025\nTest: bionic unit tests (32-bit x86)\nChange-Id: I8be6369e8be3938906628ae1f82be13e6c510119\n"
    },
    {
      "commit": "bb7e1236f3676baffd5953061154e9a3552317d7",
      "tree": "a1ddb820db657e34a56e66dd81a0b04a46922673",
      "parents": [
        "58dd1cbd7f2a0b8a779f2f43c45447cdccc09c3e"
      ],
      "author": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Tue Jan 29 20:23:16 2019 -0800"
      },
      "committer": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Wed Jan 30 22:13:13 2019 -0800"
      },
      "message": "Purge linker block allocators before leaving linker\n\nThis is the second attempt to purge linker block allocators.  Unlike the\npreviously reverted change which purge allocators whenever all objects\nare freed, we only purge right before control leaves the linker.  This\nlimits the performance impact to one munmap() call per dlopen(), in\nmost cases.\n\nBug: 112073665\nTest: Boot and check memory usage with \u0027showmap\u0027.\nTest: Run camear cold start performance test.\nChange-Id: I02c7c44935f768e065fbe7ff0389a84bd44713f0\n"
    },
    {
      "commit": "e5e69e09128e2e89bcafec45be343674adf983bf",
      "tree": "3bddb0f2bd3ccb8e6cbb6b55adbe121d6936f825",
      "parents": [
        "977e47d01897be06c2b5fc30267d29f86eeb5fc1"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Jan 01 18:53:48 2019 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Jan 16 16:52:47 2019 -0800"
      },
      "message": "Record TLS modules and layout static TLS memory\n\nBug: http://b/78026329\nTest: bionic unit tests\nChange-Id: Ibf1bf5ec864c7830e4cd1cb882842b644e6182ae\n"
    },
    {
      "commit": "45d1349c638426d99a5319e7be3dbb7c36ece7eb",
      "tree": "fe566eac57d2354c8b6bf27fc9db698fe57ea6be",
      "parents": [
        "27d59338b98bba7f33eb223c4f2e1df4c3b96774"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Jan 03 02:51:30 2019 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Jan 11 15:34:22 2019 -0800"
      },
      "message": "Reorganize static TLS memory for ELF TLS\n\nFor ELF TLS \"local-exec\" accesses, the static linker assumes that an\nexecutable\u0027s TLS segment is located at a statically-known offset from the\nthread pointer (i.e. \"variant 1\" for ARM and \"variant 2\" for x86).\nBecause these layouts are incompatible, Bionic generally needs to allocate\nits TLS slots differently between different architectures.\n\nTo allow per-architecture TLS slots:\n - Replace the TLS_SLOT_xxx enumerators with macros. New ARM slots are\n   generally negative, while new x86 slots are generally positive.\n - Define a bionic_tcb struct that provides two things:\n    - a void* raw_slots_storage[BIONIC_TLS_SLOTS] field\n    - an inline accessor function: void*\u0026 tls_slot(size_t tpindex);\n\nFor ELF TLS, it\u0027s necessary to allocate a temporary TCB (i.e. TLS slots),\nbecause the runtime linker doesn\u0027t know how large the static TLS area is\nuntil after it has loaded all of the initial solibs.\n\nTo accommodate Golang, it\u0027s necessary to allocate the pthread keys at a\nfixed, small, positive offset from the thread pointer.\n\nThis CL moves the pthread keys into bionic_tls, then allocates a single\nmapping per thread that looks like so:\n - stack guard\n - stack [omitted for main thread and with pthread_attr_setstack]\n - static TLS:\n    - bionic_tcb [exec TLS will either precede or succeed the TCB]\n    - bionic_tls [prefixed by the pthread keys]\n    - [solib TLS segments will be placed here]\n - guard page\n\nAs before, if the new mapping includes a stack, the pthread_internal_t\nis allocated on it.\n\nAt startup, Bionic allocates a temporary bionic_tcb object on the stack,\nthen allocates a temporary bionic_tls object using mmap. This mmap is\ndelayed because the linker can\u0027t currently call async_safe_fatal() before\nrelocating itself.\n\nLater, Bionic allocates a stack-less thread mapping for the main thread,\nand copies slots from the temporary TCB to the new TCB.\n(See *::copy_from_bootstrap methods.)\n\nBug: http://b/78026329\nTest: bionic unit tests\nTest: verify that a Golang app still works\nTest: verify that a Golang app crashes if bionic_{tls,tcb} are swapped\nMerged-In: I6543063752f4ec8ef6dc9c7f2a06ce2a18fc5af3\nChange-Id: I6543063752f4ec8ef6dc9c7f2a06ce2a18fc5af3\n(cherry picked from commit 1e660b70da625fcbf1e43dfae09b7b4817fa1660)\n"
    },
    {
      "commit": "07440a87732b0f23f8866256cf460b0798f08b8a",
      "tree": "db993d6293c37214c37d52f5f2cd032891887991",
      "parents": [
        "5a66490e3b9738cc70162257788bcc00583032fa"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Nov 22 03:16:06 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Dec 04 13:51:56 2018 -0800"
      },
      "message": "Replace TLS_SLOT_BIONIC_PREINIT w/ shared globals\n\nInstead of passing the address of a KernelArgumentBlock to libc.so for\ninitialization, use __loader_shared_globals() to initialize globals.\n\nMost of the work happened in the previous CLs. This CL switches a few\nKernelArgumentBlock::getauxval calls to [__bionic_]getauxval and stops\nrouting the KernelArgumentBlock address through the libc init functions.\n\nBug: none\nTest: bionic unit tests\nChange-Id: I96c7b02c21d55c454558b7a5a9243c682782f2dd\nMerged-In: I96c7b02c21d55c454558b7a5a9243c682782f2dd\n(cherry picked from commit 746ad15912cfa82271424747e94d8125acc43d8c)\n"
    },
    {
      "commit": "9cfca866ce36458bb942b7eebc4997f7bb94d3ad",
      "tree": "f0a8fbdff8af4c8a911b4e88c248f7256f941bbc",
      "parents": [
        "949269828e14167cef09ed7a5ba99df170b5adb6"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Nov 22 02:44:09 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Dec 04 13:51:36 2018 -0800"
      },
      "message": "Split main thread init into early+late functions\n\nSplit __libc_init_main_thread into __libc_init_main_thread_early and\n__libc_init_main_thread_late. The early function is called very early in\nthe startup of the dynamic linker and static executables. It initializes\nthe global auxv pointer and enough TLS memory to do system calls, access\nerrno, and run -fstack-protector code (but with a zero cookie because the\ncode for generating a cookie is complex).\n\nAfter the linker is relocated, __libc_init_main_thread_late finishes\nthread initialization.\n\nBug: none\nTest: bionic unit tests\nChange-Id: I6fcd8d7587a380f8bd649c817b40a3a6cc1d2ee0\nMerged-In: I6fcd8d7587a380f8bd649c817b40a3a6cc1d2ee0\n(cherry picked from commit 39bc44bb0e03514e8d92f8c0ceb0b5901e27a485)\n"
    },
    {
      "commit": "6b70fda682419b1cb41b33bfd84c66c037b7390e",
      "tree": "bfa841808df6ed69eef493dfda2eb4e94812bce0",
      "parents": [
        "c7cbef4f2dca7de4fb6186df05e0208d7d7fbfa5",
        "48b1159bb82b12bdd75be9228bd43db45168bdba"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Nov 30 02:06:52 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Nov 30 02:06:52 2018 +0000"
      },
      "message": "Merge changes I376d7695,Ied443375,I614d25e7\n\n* changes:\n  Use shared globals to init __progname + environ\n  Move the abort message to libc_shared_globals\n  Expose libc_shared_globals to libc.so with symbol\n"
    },
    {
      "commit": "c7cbef4f2dca7de4fb6186df05e0208d7d7fbfa5",
      "tree": "2e007e9e9dbc3ae5d85059bb51c9b15acf408c91",
      "parents": [
        "7260329093c3a36536e0bebf4ed5b929430f4efb",
        "66bc428f93546065ca73779ebefd1082244ecea2"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Nov 29 16:50:37 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Nov 29 16:50:37 2018 +0000"
      },
      "message": "Merge \"linker: changes to init work arounds\""
    },
    {
      "commit": "48b1159bb82b12bdd75be9228bd43db45168bdba",
      "tree": "876b546289ca58c6bb0a923c325aedeef7fd5cf8",
      "parents": [
        "7752bcb234a9960d2e9e89766d143b7ac0c5f332"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Nov 22 02:41:36 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Nov 28 14:26:14 2018 -0800"
      },
      "message": "Use shared globals to init __progname + environ\n\nInitialize the __progname and environ global variables using\nlibc_shared_globals rather than KernelArgumentBlock.\n\nAlso: suppose the linker is invoked on an executable:\n\n    linker prog [args...]\n\nThe first argument passed to main() and constructor functions is \"prog\"\nrather than \"linker\". For consistency, this CL changes the BSD\n__progname global from \"linker\" to \"prog\".\n\nBug: none\nTest: bionic unit tests\nChange-Id: I376d76953c9436706dbc53911ef6585c1acc1c31\n"
    },
    {
      "commit": "7752bcb234a9960d2e9e89766d143b7ac0c5f332",
      "tree": "e7bcae45f66a0682f07d242f18b33681fc9e4cfa",
      "parents": [
        "abf736a7803f4acc8b70a2dab0d43b931aa9c5c0"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Nov 22 02:41:04 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Nov 28 14:26:14 2018 -0800"
      },
      "message": "Move the abort message to libc_shared_globals\n\n__libc_shared_globals() is available in dynamic modules as soon as\nrelocation has finished (i.e. after ifuncs run). Before ifuncs have run,\nthe android_set_abort_message() function already doesn\u0027t work because it\ncalls public APIs via the PLT. (If this matters, we can use a static\nbool variable to enable android_set_abort_message after libc\ninitialization).\n\n__libc_shared_globals() is hidden, so it\u0027s available in the linker\nimmediately (i.e. before relocation). TLS memory (e.g. errno) currently\nisn\u0027t accessible until after relocation, but a later patch fixes that.\n\nBug: none\nTest: bionic unit tests\nChange-Id: Ied4433758ed2da9ee404c6158e319cf502d05a53\n"
    },
    {
      "commit": "abf736a7803f4acc8b70a2dab0d43b931aa9c5c0",
      "tree": "72009b4f3acbd65415b4c1ed2244d1c560269349",
      "parents": [
        "12ed389ca5ea756f664de6f76118c886f7bac865"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Nov 22 02:40:17 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Nov 28 14:26:14 2018 -0800"
      },
      "message": "Expose libc_shared_globals to libc.so with symbol\n\nPreviously, the address of the global variable was communicated from the\ndynamic linker to libc.so using a field of KernelArgumentBlock, which is\ncommunicated using the TLS_SLOT_BIONIC_PREINIT slot.\n\nAs long as this function isn\u0027t called during relocations (i.e. while\nexecuting an ifunc), it always return a non-NULL value. If it\u0027s called\nbefore its PLT entry is relocated, I expect a crash.\n\nI removed the __libc_init_shared_globals function. It\u0027s currently empty,\nand I don\u0027t think there\u0027s one point in libc\u0027s initialization where\nshared globals should be initialized.\n\nBug: http://b/25751302\nTest: bionic unit tests\nChange-Id: I614d25e7ef5e0d2ccc40d5c821dee10f1ec61c2e\n"
    },
    {
      "commit": "701bd0cc88092521fdafe6cdd88317469ad4ec1c",
      "tree": "0fc8dabab1ed23365492b44637e5c412273b4359",
      "parents": [
        "7f92fbe06484f036274952efa00fb5cdf410eb12"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Nov 21 16:23:03 2018 -0800"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Nov 26 18:37:13 2018 -0800"
      },
      "message": "Cleanup: __libc_init_AT_SECURE, auxv, sysinfo\n\n__sanitize_environment_variables is only called when getauxval(AT_SECURE)\nis true.\n\nInstead of scanning __libc_auxv, reuse getauxval. If the entry is missing,\ngetauxval will set errno to ENOENT.\n\nReduce the number of times that __libc_sysinfo and __libc_auxv are\ninitialized. (Previously, __libc_sysinfo was initialized 3 times for the\nlinker\u0027s copy). The two variables are initialized in these places:\n - __libc_init_main_thread for libc.a (including the linker copy)\n - __libc_preinit_impl for libc.so\n - __linker_init: the linker\u0027s copy of __libc_sysinfo is still initialized\n   twice, because __libc_init_main_thread runs after relocation. A later\n   CL consolidates the linker\u0027s two initializations.\n\nBug: none\nTest: bionic unit tests\nChange-Id: I196f4c9011b0d803ee85c07afb415fcb146f4d65\n"
    },
    {
      "commit": "66bc428f93546065ca73779ebefd1082244ecea2",
      "tree": "09c8940fa17df80cdd9d21cf9e4a8b463ffbaa3f",
      "parents": [
        "e2833f27c17e87021dae45c0d45025afd51f1e7e"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Nov 08 13:40:52 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Nov 08 21:50:19 2018 +0000"
      },
      "message": "linker: changes to init work arounds\n\nChange three things regarding the work around to the fact that init is\nspecial:\n\n1) Only first stage init is special, so we change the check to include\n   accessing /proc/self/exe, which if is available, means that we\u0027re\n   not first stage init and do not need any work arounds.\n2) Fix the fact that /init may be a symlink and may need readlink()\n3) Suppress errors from realpath_fd() since these are expected to fail\n   due to /proc not being mounted.\n\nBug: 80395578\nTest: sailfish boots without the audit generated from calling stat()\n      on /init and without the errors from realpath_fd()\n\nChange-Id: I266f1486b142cb9a41ec791eba74122bdf38cf12\n"
    },
    {
      "commit": "8f639a40966c630c64166d2657da3ee641303194",
      "tree": "96e03d65a4efa6613941b748ed2c11b64a8dec1b",
      "parents": [
        "cb8ed207d2bb6113a80fc7f27cd0beb8897f5192"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Oct 01 23:10:05 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Oct 10 14:31:06 2018 -0700"
      },
      "message": "Allow invoking the linker on an executable.\n\nThe executable can be inside a zip file using the same syntax used for\nshared objects: path.zip!/libentry.so.\n\nThe linker currently requires an absolute path. This restriction could be\nloosened, but it didn\u0027t seem important? If it allowed non-absolute paths,\nwe\u0027d need to decide how to handle:\n - foo/bar      (relative to CWD?)\n - foo          (search PATH / LD_LIBRARY_PATH, or also relative to CWD?)\n - foo.zip!/bar (normalize_path() requires an absolute path)\n\nThe linker adjusts the argc/argv passed to main() and to constructor\nfunctions to hide the initial linker argument, but doesn\u0027t adjust the auxv\nvector or files like /proc/self/{exe,cmdline,auxv,stat}. Those files will\nreport that the kernel loaded the linker as an executable.\n\nI think the linker_logger.cpp change guarding against (g_argv \u003d\u003d NULL)\nisn\u0027t actually necessary, but it seemed like a good idea given that I\u0027m\ndelaying initialization of g_argv until after C++ constructors have run.\n\nBug: http://b/112050209\nTest: bionic unit tests\nChange-Id: I846faf98b16fd34218946f6167e8b451897debe5\n"
    },
    {
      "commit": "0489645e000428eb08bfc201dcf6d0dfa919d4a8",
      "tree": "e79ac0cc0bfa27d99cb0fad6b8d3293dac47ab73",
      "parents": [
        "14dd9923b026c4500dc5b3f6f481b6bf1028778c"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Aug 20 17:44:42 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Aug 21 17:20:07 2018 -0700"
      },
      "message": "Fix linker\u0027s _r_debug (gdb) info\n\n * Initialize the exe\u0027s l_ld correctly, and initialize its l_addr field\n   earlier.\n\n * Copy the phdr/phnum fields from the linker\u0027s temporary soinfo to its\n   final soinfo. This change ensures that dl_iterate_phdr shows the phdr\n   table for the linker.\n\n * Change init_linker_info_for_gdb a little: use an soinfo\u0027s fields to\n   init the soinfo::link_map_head field, then reuse the new\n   init_link_map_head function to handle the linker and the executable.\n\nTest: manual\nTest: bionic-unit-tests\nBug: https://issuetracker.google.com/112627083\nBug: http://b/110967431\nChange-Id: I40fad2c4d48f409347aaa1ccb98d96db89da1dfe\n"
    },
    {
      "commit": "14dd9923b026c4500dc5b3f6f481b6bf1028778c",
      "tree": "eed9629618dd1ffc9d2071a121e2b701b6cb6cca",
      "parents": [
        "3fd45bba4857fdbf320b6e89d2ae0569d9463bf5"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Aug 20 17:43:44 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Aug 20 22:07:27 2018 -0700"
      },
      "message": "Move [vdso] after exe/linker in _r_debug\n\ngdbserver assumes that the first entry is the exe, so it must come\nfirst.\n\nFixes debugging of executables with gdb.\n\nBug: https://issuetracker.google.com/112627083\nBug: http://b/110967431\nTest: gdbclient.py -r toybox\nChange-Id: I7b30398d679c3f8b92d8d02572f9073ae0fce798\n"
    },
    {
      "commit": "9729f35922aee4d1662b97d62d82385f6b8124ef",
      "tree": "644ed730855f795498485521d6216bb7e9e9d2d1",
      "parents": [
        "3bf897e12d73f5c038aeef85f91ccce1c35fe326"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Jul 13 22:40:26 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Jul 26 20:31:47 2018 -0700"
      },
      "message": "linker: find AT_BASE using AT_PHDR/AT_PHNUM\n\nWhen the linker is invoked directly, rather than as an interpreter for a\nreal program, the AT_BASE value is 0. To find the linker\u0027s base address,\nthe linker currently relies on the static linker populating the target of\na RELA relocation with an offset rather than leaving it zero. (With lld,\nit will require a special flag, --apply-dynamic-relocs.)\n\nInstead, do something more straightforward: the linker already finds the\nexecutable\u0027s base address using its PHDR table, so do the same thing when\nthe linker is run by itself.\n\nBug: http://b/72789859\nTest: boots, run linker/linker64 by itself\nChange-Id: I4da5c346ca164ea6f4fbc011f8c3db4e6a829456\n"
    },
    {
      "commit": "f6e5b582604715729b09db3e36a7aeb8c24b36a4",
      "tree": "1d68c449355f88a0652d3c1e2d6679b54fce1b20",
      "parents": [
        "ad596bf4fc406c0940d0f76f6b7c4ff22ecee7ac"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Jun 01 15:30:54 2018 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Jul 19 14:28:54 2018 -0700"
      },
      "message": "Introduce api to track fd ownership in libc.\n\nAdd two functions to allow objects that own a file descriptor to\nenforce that only they can close their file descriptor.\n\nUse them in FILE* and DIR*.\n\nBug: http://b/110100358\nTest: bionic_unit_tests\nTest: aosp/master boots without errors\nTest: treehugger\nChange-Id: Iecd6e8b26c62217271e0822dc3d2d7888b091a45\n"
    },
    {
      "commit": "31cd08f9eb857963ce1ab331d0ecf0c6c6b79670",
      "tree": "38fb9f800a8976a03b047c54e8b138f272f60eec",
      "parents": [
        "8d7866c58f95695e65e8780712cc6c692fb4af72"
      ],
      "author": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Fri Jun 01 19:18:56 2018 +0900"
      },
      "committer": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Fri Jun 08 14:50:14 2018 +0900"
      },
      "message": "dynamic linker is running for init\n\ninit is now built as a dynamic executable, so the dynamic linker has to\nbe able to run in the init process. However, since init is launched so\nearly, even /dev/* and /proc/* file systems are not mounted and thus\nsome APIs that rely on the paths do not work. The dynamic linker now\ngoes alternative path when it is running in the init process.\n\nFor example, /proc/self/exe is not read for the init since we always now\nthe path of the init (/init). Also, arc4random* APIs are not used since\nthe APIs rely on /dev/urandom. Linker now does not randomize library\nloading order and addresses when running in the init process.\n\nBug: 80454183\nTest: `adb reboot recovery; adb devices` shows the device ID\nChange-Id: I29b6d70e4df5f7f690876126d5fe81258c1d3115\n"
    },
    {
      "commit": "742982d3a086473427e71089a6c9ba8df0c365e6",
      "tree": "a713d5bdf5bd92c6f7ab91179be346e941666626",
      "parents": [
        "fe55c272adf89ecf14c5aa068119bfadf2c28457"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed May 30 22:32:17 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu May 31 17:04:52 2018 -0700"
      },
      "message": "Avoid post-reloc GOT usage in __linker_init\n\nA GOT lookup happening prior to soinfo::link_image causes a segfault. With\n-O0, the compiler moves GOT lookups from after __linker_init\u0027s link_image\ncall to the start of __linker_init.\n\nRename the existing __linker_init_post_relocation to linker_main, then\nextract the existing post-link_image code to a new\n__linker_init_post_relocation function.\n\nBug: http://b/80503879\nTest: /data/nativetest64/bionic-unit-tests/bionic-unit-tests\nTest: manual\nChange-Id: If8a470f8360acbe35e2a308b0fbff570de6131cf\n"
    },
    {
      "commit": "27475b5105e30332dd2145e0bfba098b756673d9",
      "tree": "02f72da22fcc8e2d2e8bf6db1e84d10f3365592c",
      "parents": [
        "cb5f4100060cd9894273863a973d622d6ebd2719"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu May 17 17:14:18 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed May 30 16:44:23 2018 -0700"
      },
      "message": "Initialize __libc_sysinfo early on.\n\n__libc_sysinfo is hidden, so accessing it doesn\u0027t require a relocated GOT.\nIt is important not to have a relocatable initializer on __libc_sysinfo,\nbecause if it did have one, and if we initialized it before relocating the\nlinker, then on 32-bit x86 (which uses REL rather than RELA), the\nrelocation step would calculate the wrong addend and overwrite\n__libc_sysinfo with garbage.\n\nAsides:\n\n * It\u0027d be simpler to keep the __libc_sysinfo initializer for static\n   executables, but the loader pulls in libc_init_static (even though it\n   uses almost none of the code in that file, like __libc_init).\n\n * The loader has called __libc_init_sysinfo three times by the time it\n   has relocated itself. A static executable calls it twice, while libc.so\n   calls it only once.\n\nBug: none\nTest: lunch aosp_x86-userdebug ; emulator\nTest: adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests\nTest: adb shell /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static\nChange-Id: I5944f57847db7191608f4f83dde22b49e279e6cb\n"
    },
    {
      "commit": "6631f9b03dd032519be4b1971c2399a6e5e59357",
      "tree": "5e08b395a93f4a1cf4ec0fc83b7a09b4e864e51d",
      "parents": [
        "aa922bbaf38d896ecb46ae08c675c2ef0df811db"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Apr 30 18:29:32 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed May 30 15:43:43 2018 -0700"
      },
      "message": "Clean up TLS_SLOT_BIONIC_PREINIT usage a bit\n\n - It is only needed for dynamic executables, so move the initialization\n   out of __libc_init_main_thread and just before the solib constructor\n   calls. For static executables, the slot was initialized, then never\n   used or cleared. Instead, leave it clear.\n\n - For static executables, __libc_init_main_thread already initialized the\n   stack guard, so remove the redundant __init_thread_stack_guard call.\n\n - Simplify the slot access/clearing a bit in __libc_preinit.\n\n - Remove the \"__libc_init_common() will change the TLS area so the old one\n   won\u0027t be accessible anyway.\" comment. AFAICT, it\u0027s incorrect -- the\n   main thread\u0027s TLS area in a dynamic executable is initialized to a\n   static pthread_internal_t object in the linker, then reused by libc.so.\n\nTest: adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests\nTest: adb shell /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static\nChange-Id: Ie2da6f5be3ad563fa65b38eaadf8ba6ecc6a64b6\n"
    },
    {
      "commit": "8b142566e346beeabca774e01f81934280bcd6b6",
      "tree": "f55079f62d362e1f076a2152055c1133ae648674",
      "parents": [
        "e0906d8f558675f77636f79e9f232329a3b95e2e"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Wed May 09 15:22:38 2018 +0200"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Sat May 12 10:58:00 2018 +0200"
      },
      "message": "vdso should be available in all namespaces\n\nvdso should be available in all namespaces when present. This\nbug went undetected because the way libc currently uses vdso (it\ndoes all the lookups itself). This makes it available for the\nprograms that want to take advantage by dlopening it.\n\nBug: http://b/73105445\nBug: http://b/79561555\nTest: adb shell /data/nativetest/arm/bionic-unit-tests/bionic-unit-tests --gtest_filter\u003ddl.exec_with_ld_config_file\nTest: adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests --gtest_filter\u003ddl*\nChange-Id: I8eae0c9848f256190d1c9ec85d10dc6ce383a8bc\n(cherry picked from commit 69c68c46ac18a440bf1c0447d8343a6dbad595f1)\n"
    },
    {
      "commit": "965d06da1ed957c349dbdfcc7831b462b757bf85",
      "tree": "e07845fb90aa116761abf3699c114a156fb02650",
      "parents": [
        "d351581aa9ba1fbce227db35500471fe59c45f08"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Tue Nov 28 16:03:07 2017 +0100"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Sun Dec 10 22:04:55 2017 +0100"
      },
      "message": "Fix logic in loading dependencies crossing namespace boundaries\n\nThis change addresses multiple problems introduced by\n02586a2a34e6acfccf359b94db840f422b6c0231\n\n1. In the case of unsuccessful dlopen the failure guard is triggered\nfor two namespaces which leads to double unload.\n\n2. In the case where load_tasks includes libraries from 3 and more\nnamespaces it results in incorrect linking of libraries shared between\nsecond and third/forth and so on namespaces.\n\nThe root cause of these problems was recursive call to find_libraries.\nIt does not do what it is expected to do. It does not form new load_tasks\nlist and immediately jumps to linking local_group. Not only this skips\nreference counting it also will include unlinked but accessible library\nfrom third (and fourth and fifth) namespaces in invalid local group. The\nbest case scenario here is that for 3 or more namesapces this will\nfail to link. The worse case scenario it will link the library\nincorrectly with will lead to very hard to catch bugs.\n\nThis change removes recursive call and replaces it with explicit list of\nlocal_groups which should be linked. It also revisits the way we do\nreference counting - with this change the reference counts are updated after\nafter libraries are successfully loaded.\n\nAlso update soinfo_free to abort in case when linker tries to free same\nsoinfo for the second time - this makes linker behavior less undefined.\n\nTest: bionic-unit-tests\nBug: http://b/69787209\nChange-Id: Iea25ced181a98c6503cce6e2b832c91d697342d5\n"
    },
    {
      "commit": "27242c642eac64d4d47a1899af341170c9456d79",
      "tree": "8c60543178f3b463555b2e42638a3d5cc9da0d87",
      "parents": [
        "8f348a0cce048fc929b4ce0b850147cd7c737497"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Oct 20 17:45:13 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Oct 20 17:47:29 2017 -0700"
      },
      "message": "Actually correctly call vector::erase after remove_if.\n\nvector::erase(iterator) erases the element that that iterator points\nto, vector::erase(iterator a, iterator b) erases the range [a, b), with\na \u003d\u003d b being a no-op.\n\nTest: LD_PRELOAD\u003dlibc.so sh\nChange-Id: I6a85c1cfaa8eb67756cb75d421f332d5c9a43a33\n"
    },
    {
      "commit": "44f6e189d97fa3e07e2a95605d4ecd76bc73b103",
      "tree": "7d408fac0b7c362e025aca37b4cbd3bd9bd55490",
      "parents": [
        "ab9dc08bdd60d3709e1bce555625d923b32812be"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Oct 18 17:25:24 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Oct 18 17:29:39 2017 -0700"
      },
      "message": "Correctly call vector::erase after std::remove_if.\n\nstd::remove_if moves removed elements to the end, without actually\nresizing the collection. To do so, you have to call erase on its\nreturned iterator.\n\nTest: mma\nChange-Id: Iae7f2f194166408f2b101d0c1cfc95202d8bbe63\n"
    },
    {
      "commit": "04f7a798cff26c1809138d329e0a5717efc2b3c5",
      "tree": "314d022f48abb92d9fd690b07c205c15b791ab7a",
      "parents": [
        "bd2754177fc26b255b64af0b50c32f984a274cf9"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Fri Sep 29 11:52:17 2017 +0200"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Fri Sep 29 19:48:46 2017 +0200"
      },
      "message": "Replace abort with exit(1) in __linker_cannot_link\n\nBug: http://b/67038409\nTest: bionic-unit-tests\nChange-Id: I7d39b44f2da8c5111ac8a9faf3416f19d5a35c05\n"
    },
    {
      "commit": "c18de1bd47a558c9a24c6a4645df27df2c4738b4",
      "tree": "12560d5f188699814f191c5221e5ccb177ae25a1",
      "parents": [
        "9c172c86e719fc75a75e16d629c088d4aeb9a6cb"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Tue Sep 26 14:31:35 2017 +0200"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Tue Sep 26 14:34:18 2017 +0200"
      },
      "message": "Link vdso before linking the main executable\n\nAlso set linked flag after it is linked and\ncall constructors. Set RTLD_NODELETE flag to\nprevent accidental unloads.\n\nTest: bionic-unit-tests --gtest_filter\u003ddl*:Dl*\nTest: bionic-unit-tests-glibc --gtest_filter\u003ddl*\nChange-Id: Ib2178849b918cbefd6f8fcfe6d1f78889fe0bf76\n"
    },
    {
      "commit": "7b0af7ad82fcf88e800d1a553d81fda29dc064bd",
      "tree": "4cf982c55c48b49864bcb4f986c7400d640930e0",
      "parents": [
        "3b64f8ecb3db49574cc5b7c6030be98c159be4d4"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Sep 15 16:09:22 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Sep 15 16:18:49 2017 -0700"
      },
      "message": "Always log errno when aborting.\n\n(Where errno is relevant.)\n\nAlso consistently use -1 as the fd for anonymous mmaps. (It doesn\u0027t matter,\nbut it\u0027s more common, and potentially more intention-revealing.)\n\nBug: http://b/65608572\nTest: ran tests\nChange-Id: Ie9a207632d8242f42086ba3ca862519014c3c102\n"
    },
    {
      "commit": "7abea57ba599b9b114031ae33699b5d7fba8cc97",
      "tree": "773b5e56bf6c0cd110f86797a6be7cd8923fceda",
      "parents": [
        "25bf29bbadaeb593bdb9211dc75063903ce369e4"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Tue Aug 29 18:14:49 2017 +0200"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Tue Aug 29 18:18:28 2017 +0200"
      },
      "message": "Replace artificial symbol table with proper one\n\nThis change also replaces elf-hash with gnu-hash.\n\nTest: make\nTest: bionic-unit-tests --gtest_filter\u003ddl*:Dl*\nChange-Id: Ibc4026f7abc7e8002f69c33eebaf6a193f1d22eb\n"
    },
    {
      "commit": "02586a2a34e6acfccf359b94db840f422b6c0231",
      "tree": "9dde1a2bcf8a004b23fe41b9f3e497895d44e44d",
      "parents": [
        "5ac5a7c0839a123c2982b37b383a7691fd216e7e"
      ],
      "author": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Sat May 20 01:01:24 2017 +0900"
      },
      "committer": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Thu Aug 03 01:02:07 2017 +0900"
      },
      "message": "linker: the global group is added to all built-in namespaces\n\nWith ld.config.txt, we now have multiple built-in namespaces other than\nthe default namespace. Libs (and their dependents) listed in LD_PRELOAD\nmust be visible to those additional namespaces as well.\n\nThis also adds a debugging only feature: path to the linker config file\ncan be customized via LD_CONFIG_FILE environment variable. This works\nonly for debuggable builds.\n\nBug: 38114603\nBug: 62815515\nTest: 1. ./external/compiler-rt/lib/asan/scripts/asan_device_setup --lib\nprebuilts/clang/host/linux-x86/clang-stable/lib64/clang/5.0/lib/linux\n2. enable talkback shortcut\n3. in the home screen, hold vol-up/down together\n4. device does not reboots and talkback shortcut is toggled\nTest: bionic-unit-tests and linker-unit-tests successful\n\nChange-Id: I9a03591053f4a9caea82f0dcb23e7a3d324bb9bd\n"
    },
    {
      "commit": "ad2d0380a69db3066d49c5a67b85d6858236012f",
      "tree": "300564f58ef74246303d2e44cfd99645e0376ab1",
      "parents": [
        "bafa1985eccaac231ade6f15d340759f44928524"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jul 31 11:43:34 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Aug 01 10:06:10 2017 -0700"
      },
      "message": "Clean up linker fatals slightly.\n\nUse __linker_cannot_link more consistently, and fix a comment.\n\nBug: http://b/22798163\nTest: ran tests\nChange-Id: Id6d868f459997eaa67b8cbbf85b0b0f2749bf43d\n"
    },
    {
      "commit": "f9abbf69838bd8649d51fe3b8b6550fc14462757",
      "tree": "7187cf993ac1fd8e9ef586aa3089aebc055af72d",
      "parents": [
        "f45bc14d5497c30bd43e22d025e3b88812b2baa4"
      ],
      "author": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Thu Jul 06 12:17:14 2017 +0200"
      },
      "committer": {
        "name": "dimitry",
        "email": "dimitry@google.com",
        "time": "Thu Jul 06 12:24:33 2017 +0200"
      },
      "message": "The ifdef check for AT_SYSINFO_EHDR is no longer needed\n\nAT_SYSINFO_EHDR is present in all architectures\n\nTest: make\nChange-Id: I0f4c115bb48e47ea156e7fca936960f5f10c618e\n"
    },
    {
      "commit": "705910094d07ddfc5a3b7a4baab58b0a94bcc691",
      "tree": "f503093f7f1675566233ac00bda745b8a9bcf714",
      "parents": [
        "82d746fb39465e78088aeb11a5dc178cf264d0c0"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Tue Jun 27 16:23:45 2017 -0700"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Jun 28 15:03:15 2017 -0700"
      },
      "message": "bionic: fix assorted static analyzer warnings\n\nWarnings:\n\nbionic/libc/bionic/fts.c:722:5: warning: Null passed to a callee that\nrequires a non-null 1st parameter\n\nbionic/libc/bionic/sched_cpualloc.c:34:25: warning: Result of \u0027malloc\u0027\nis converted to a pointer of type \u0027cpu_set_t\u0027, which is incompatible\nwith sizeof operand type \u0027unsigned long\u0027\n\nbionic/linker/linker_main.cpp:315:7: warning: Access to field \u0027e_type\u0027\nresults in a dereference of a null pointer (loaded from variable\n\u0027elf_hdr\u0027)\n\nbionic/linker/linker_main.cpp:493:66: warning: Access to field \u0027e_phoff\u0027\nresults in a dereference of a null pointer (loaded from variable\n\u0027elf_hdr\u0027)\n\nbionic/linker/linker_main.cpp:90:14: warning: Access to field \u0027next\u0027\nresults in a dereference of a null pointer (loaded from variable \u0027prev\u0027)\n\nBug: None\nTest: mma; analyzer warnings are gone. CtsBionicTestCases pass.\nChange-Id: I699a60c2c6f64c50b9ea06848a680c98a8abb44a\n"
    },
    {
      "commit": "cd510cbed9dc1e1b65b9d34676fdf6d85101f22c",
      "tree": "8546acbe8ef79aa92ea066249794a7229c21280e",
      "parents": [
        "6be65c135b1720353f0c2e472a5e01261a737cd1"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Wed May 31 15:07:41 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed May 31 23:45:15 2017 +0000"
      },
      "message": "Make dl_iterate_phdr return correct name for first entry\n\nTest: bionic-unit-tests --gtest_filter\u003dlink*\nChange-Id: Ib3f1e0fbc76fed9a5f27ffdd9bbf847a3e8d3665\n"
    },
    {
      "commit": "7a3681e5b6c39bc2b3b62031ca5941dbf7bc4e63",
      "tree": "78c25e2a38b7efed8db770a623a5cbfb7eaab11d",
      "parents": [
        "ca5e0f49ca5df873a20c996755175b5c9c1e2ed9"
      ],
      "author": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Mon Apr 24 17:48:32 2017 -0700"
      },
      "committer": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Wed May 03 08:50:43 2017 -0700"
      },
      "message": "Move libc_log code into libasync_safe.\n\nThis library is used by a number of different libraries in the system.\nMake it easy for platform libraries to use this library and create\nan actual exported include file.\n\nChange the names of the functions to reflect the new name of the library.\n\nRun clang_format on the async_safe_log.cpp file since the formatting is\nall over the place.\n\nBug: 31919199\n\nTest: Compiled for angler/bullhead, and booted.\nTest: Ran bionic unit tests.\nTest: Ran the malloc debug tests.\nChange-Id: I8071bf690c17b0ea3bc8dc5749cdd5b6ad58478a\n"
    },
    {
      "commit": "deca8effd089b7b3c97eec8a1fb5dcedb9c35ade",
      "tree": "e3f3c35c83a6e476d1d20c7d83274353b7bf07d3",
      "parents": [
        "fe96db819ba0254123f4960bc150ce2c104d3bc0",
        "4cabfaad340c957ff691cfbc420b29da805c5dd8"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Sat Mar 25 05:17:31 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat Mar 25 05:17:32 2017 +0000"
      },
      "message": "Merge \"Load namespace configuration from ld.config.txt\""
    },
    {
      "commit": "4cabfaad340c957ff691cfbc420b29da805c5dd8",
      "tree": "91df98d18f36ed19f857db91688c8b62f6f242de",
      "parents": [
        "e98d1e68ce37bb9238e3c50ea6b01d1057adb2eb"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Tue Mar 07 11:19:05 2017 -0800"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Fri Mar 24 15:50:45 2017 -0700"
      },
      "message": "Load namespace configuration from ld.config.txt\n\nThis change allows customization of default namespace\nconfiguration for different executables. It also enables\ntarget_sdk_version setup for binaries (note that this\noption should explicitly be enabled in ld.config.txt).\n\nBug: http://b/30706810\nBug: http://b/30435785\nTest: run linker-unit-tests/bionic-unit-tests, boot angler\nChange-Id: Ibbe87209acf1538fc9cec04944f3d22a190c38f1\n"
    },
    {
      "commit": "9b1cc4bb9cd84c2a52b8183a418e9dbb41f59959",
      "tree": "30c02abec3509a67589add48341d475c78e71f4e",
      "parents": [
        "e98d1e68ce37bb9238e3c50ea6b01d1057adb2eb"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Thu Mar 23 16:17:15 2017 -0700"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Thu Mar 23 17:12:59 2017 -0700"
      },
      "message": "loader: stop relying on AT_BASE\n\nandroid loader should not rely on the fact\nthat AT_BASE is set because kernel currently\ndoes not set it when linker is run standalone\n(The linker does not have PT_INTERP set)\n\nThis commit replaces AT_BASE with calculated value.\n\nBug: http://b/30739481\nBug: http://b/35890756\nTest: run bionic-unit-tests --gtest_filter\u003ddl*\nChange-Id: Ic2eb73e4452624b1f2e05f46e99e4c17df0bbc3f\n"
    },
    {
      "commit": "2a6955e040f24b31a2dfe829f47e35ac91733489",
      "tree": "e91c30cf688ab2fd0d55546042d3496f489db7de",
      "parents": [
        "5927b04ce7d9d4727a4a644f8af4040b8dab5d0a"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Thu Feb 23 11:53:43 2017 -0800"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Fri Feb 24 16:56:38 2017 -0800"
      },
      "message": "loader: set PT_INTERP to itself\n\nSome versions of kernel set AT_BASE to 0\nif dynamic loader does not have PT_INTERP\nset.\n\nBug: http://b/30739481\nTest: run /system/bin/linker64 and /system/bin/linker\nChange-Id: I1b67777166fe917d3ee1a97277045ca6f5db0084\n"
    },
    {
      "commit": "7d429d3c480166e1013bcdf68f4be479209aa509",
      "tree": "8aa0ee9551134cd88bc89ebdbc40e0f398f50971",
      "parents": [
        "e86a8d605b3df0c396e23ee02933c76d7040a73b"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Wed Feb 01 15:28:52 2017 -0800"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Thu Feb 09 23:26:44 2017 -0800"
      },
      "message": "Replace public library list with shared lib sonames (part 1/2)\n\nReplace public library list with shared lib sonames\nwhich are property of a link between namespaces\n\nThis change does not touch any external interfaces\nso from outside it behaves almost as it was before\n\nOne significant difference is that there is no longer\nneed to preload public libraries.\n\nBug: http://b/26833548\nTest: bionic-unit-tests --gtest_filter\u003ddl*:Dl*\nChange-Id: I57e44e18a9b4f07dcd6556436346be52f52b79d7\n"
    },
    {
      "commit": "95e2e6f6204ea02de9e0dad9bd274e3c5d51a88c",
      "tree": "e24508d0f082aff47ffe3c51e5d63b84379d1e36",
      "parents": [
        "eb35144e588dc3799b851b8504b0a7db6c9a0b91"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jan 31 16:02:43 2017 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jan 31 16:02:43 2017 -0800"
      },
      "message": "Exit failure if trying to load non-PIE.\n\nAmazingly this was actually breaking the NDK\u0027s ability to build\nlibstdc++ for x86.\n\nTest: mma\nBug: None\nChange-Id: Iafa55c31fdeb35caca7d7d7a39a3e7afa0713557\n"
    },
    {
      "commit": "082bec5b419806d694f9a7d0283b2f831d52eea4",
      "tree": "4902863a691f86e4e5236344d11ef172d2f8a2c5",
      "parents": [
        "2d261e8e9e1340151698086e8434f312a73f77f0",
        "0a3637d3eb2424d8e825ad1825f843450a888406"
      ],
      "author": {
        "name": "Evgenii Stepanov",
        "email": "eugenis@google.com",
        "time": "Wed Jan 18 23:39:07 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Jan 18 23:39:08 2017 +0000"
      },
      "message": "Merge \"Runtime support for CFI\""
    },
    {
      "commit": "0a3637d3eb2424d8e825ad1825f843450a888406",
      "tree": "dc0d4c31cddc2ff06902fcbdf4233f7759258764",
      "parents": [
        "1b2975d54b9c17ced29883aef24490773a4a9fe6"
      ],
      "author": {
        "name": "Evgenii Stepanov",
        "email": "eugenis@google.com",
        "time": "Wed Jul 06 13:20:59 2016 -0700"
      },
      "committer": {
        "name": "Evgenii Stepanov",
        "email": "eugenis@google.com",
        "time": "Wed Jan 18 13:13:52 2017 -0800"
      },
      "message": "Runtime support for CFI\n\nControl Flow Integrity support in bionic.\n\nGeneral design:\nhttp://clang.llvm.org/docs/ControlFlowIntegrityDesign.html#shared-library-support\n\nThis CL implements subsections \"CFI Shadow\" and \"CFI_SlowPath\" in the above document.\n\nBug: 22033465\nTest: bionic device tests\nChange-Id: I14dfea630de468eb5620e7f55f92b1397ba06217\n"
    },
    {
      "commit": "2a3b4fa6ec9ab3d4604860b0bdd3766c9f5c44f4",
      "tree": "0e94f5fec708d835d1be78e6a28c10ab39882e3b",
      "parents": [
        "f8a6d4745daafb6aced5cdeb76325c719ca1374b"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Oct 26 17:55:49 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Jan 17 15:11:46 2017 -0800"
      },
      "message": "Rename libdebuggerd_client to libdebuggerd_handler.\n\nBug: http://b/30705528\nTest: debuggerd_test\nChange-Id: I625a9a2e7304d172873ba9344b74efa57ad7bdad\n"
    },
    {
      "commit": "607d307b1f4562219393dea3cbc6ea47b46f1650",
      "tree": "bc912ad3e55a74dbc1938c18e4bd701d8990fce7",
      "parents": [
        "71952ef625b953d78547da28d7271ea71cb91c92"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 09 14:39:44 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 09 14:44:28 2017 -0800"
      },
      "message": "Dynamic linker errors should go to stderr.\n\nAlso add the missing \\n to the end of the error.\n\nAddresses review comment.\n\nBug: N/A\nTest: manual\nChange-Id: I7c997a71e6e02381d21ac762595ba90370db9d05\n"
    },
    {
      "commit": "3bdb31b51b353d12e482d28d6ffe115944f8819e",
      "tree": "de5bab575b8b24dcb183784862a5fdc6fc4c1791",
      "parents": [
        "fb07c36bc061db4ca5d8348ff6bc1e60b6c53191"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Jan 07 10:38:20 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Jan 07 10:38:20 2017 -0800"
      },
      "message": "Exit rather than abort if asked to run a non-PIE executable.\n\nEach release we\u0027re asked to investigate tombstones from code that hasn\u0027t\nbeen allowed to run on Android since L. This is just wasting our time,\nand clearly the \"obviousness\" of aborting rather than exiting hasn\u0027t ensured\nthat all app developers rebuild their old binaries. In some cases it seems\nlike they run them \"just in case\" and don\u0027t care if they fail.\n\nBug: http://b/34112178\nTest: ran libsupervisor.so from com.ss.android.article.news\nChange-Id: I8a3f196c4755601a3888281566fbb7b817f01dca\n"
    },
    {
      "commit": "d9e427cf41893377dcdd0650ba20ff7cf7d72209",
      "tree": "6515aceab94a11861876b6e145adb6922183ebff",
      "parents": [
        "227894a754eb11cb1203c359192d59654b01b93e"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Tue Nov 22 16:55:25 2016 -0800"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Fri Dec 09 14:53:59 2016 -0800"
      },
      "message": "Bionic loader is no longer hijacking libdl.so\n\nDo not hijack libdl.so methods but make libdl proxy calls to\nloader instead. This will be replaces by calls to libc.so\nonce loader functionality is migrated.\n\nAlso add a lock to dl_unwind_find_exidx function call.\n\nTest: bionic-unit-tests --gtest_filter\u003ddl*:Dl*\nBug: http://b/27106625\nChange-Id: Ic33a7109a86f4262798d63a35f4c61d15b0068bb\n"
    },
    {
      "commit": "dcb846cb4978130d5db6b795e22e08b65e73f3cd",
      "tree": "08d415c92e8008104cd11fd76574816be320c70e",
      "parents": [
        "c12acef96bd80c419654e159e1dc24a69513a86d"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Tue Dec 06 02:10:13 2016 +0000"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Tue Dec 06 02:10:13 2016 +0000"
      },
      "message": "Revert \"Bionic loader is no longer hijacking libdl.so\"\n\nThis reverts commit c12acef96bd80c419654e159e1dc24a69513a86d.\n\nBreaks the Mips build.\n\nBug: 27106625\nChange-Id: I27edb7114065c36e1b618e387530d58189cdb184\n"
    },
    {
      "commit": "c12acef96bd80c419654e159e1dc24a69513a86d",
      "tree": "2c9ee33aa3467a7fa0765a7a2de6c686056b755c",
      "parents": [
        "f8b4ff4aa1c1a855627b8dc36f0675d69ab9109d"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Tue Nov 22 16:55:25 2016 -0800"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Mon Dec 05 11:19:19 2016 -0800"
      },
      "message": "Bionic loader is no longer hijacking libdl.so\n\nDo not hijack libdl.so methods but make libdl proxy calls to\nloader instead. This will be replaces by calls to libc.so\nonce loader functionality is migrated.\n\nAlso add a lock to dl_unwind_find_exidx function call.\n\nTest: bionic-unit-tests --gtest_filter\u003ddl*:Dl*\nBug: http://b/27106625\nChange-Id: I9e666e771e4bbca52151cfa7fc4c8677e1480818\n"
    },
    {
      "commit": "7ec52b12efc1c4ed9cd83ba8c95fab5bbf39aaf4",
      "tree": "091ac4e81ecc619f8116a3f229ad10f8c47e017d",
      "parents": [
        "11b362d284b49e070813cd459584ea3dabb20b1e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 28 17:02:25 2016 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Nov 29 21:09:05 2016 +0000"
      },
      "message": "Enable libc/libdl/libm/linker for host bionic\n\nDisables debuggerd integration unless building for android.\n\nBug: 31559095\nTest: Diff out/soong/build.ninja before/after, only change is moving\n      linker\u0027s libdebuggerd_client static lib to the beginning of the\n      list.\nTest: lunch aosp_arm64-eng; mmma -j bionic\nChange-Id: I62e725f7a9b98b7fe31637d0a835fd5846b0aff0\n"
    },
    {
      "commit": "3f6605754464c0856862c4d66ed03227a60a6f4d",
      "tree": "16a13eff76ffede482df87d0eaf8f069ad0dc43d",
      "parents": [
        "0f81dd35485563a2d111f01a1c14ac3678192c12"
      ],
      "author": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Fri Sep 09 10:00:39 2016 -0700"
      },
      "committer": {
        "name": "Dimitry Ivanov",
        "email": "dimitry@google.com",
        "time": "Tue Sep 13 13:38:58 2016 -0700"
      },
      "message": "linker: Refactoring step 3 of many\n\nExtract linker executable specific code to linker_main.cpp;\nthis part of code does not have a place in libdl.a/so.\n\nBug: http://b/14998480\nBug: http://b/30706810\nTest: mm \u0026\u0026 run bionic-unit-tests\nChange-Id: I90f7475e93a919b0f9525da22928089ad35b8f6c\n"
    }
  ]
}
