)]}'
{
  "log": [
    {
      "commit": "d3920b3a996b358e48232f417aa0a1e44a60f155",
      "tree": "b0520d0d300dbca1e6e54a9a7c26e6d2cd81ed08",
      "parents": [
        "f6afd3b670e23f56bf341d12136416aee17ea249"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 07 18:39:34 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Feb 08 11:16:13 2013 -0800"
      },
      "message": "Switch to using AT_RANDOM for the stack guards.\n\nBug: 7959813\nChange-Id: I8db4b8912ba649bfe668c6f22aa44690ddd401a2\n"
    },
    {
      "commit": "e4ccf5a138a9c6387ee2e4b8e41d628e0a2cc336",
      "tree": "adffd90b54d462c0e48c47c234d16025614a5fec",
      "parents": [
        "2f41531ff9f48dbdaf2ba711e14c669031728e99"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 07 12:06:44 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 07 12:06:44 2013 -0800"
      },
      "message": "__progname should be const char*, not char*.\n\nChange-Id: I8e846872c30a712fbc05c8da59ffa1cec1be31a4\n"
    },
    {
      "commit": "42b2c6a5eed5e4ef35315b8cd32d1355f12a69b6",
      "tree": "0fb55a369b620ef79cfa103f67a5184f067dadeb",
      "parents": [
        "d32fdbaf03f688497adbec885e85c0a69f7a4542"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 07 10:14:39 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 07 11:44:21 2013 -0800"
      },
      "message": "Clean up the argc/argv/envp/auxv handling.\n\nThere\u0027s now only one place where we deal with this stuff, it only needs to\nbe parsed once by the dynamic linker (rather than by each recipient), and it\u0027s\nnow easier for us to get hold of auxv data early on.\n\nChange-Id: I6314224257c736547aac2e2a650e66f2ea53bef5\n"
    },
    {
      "commit": "36bd371e26c716cbc18e11801b13eff0352d91b0",
      "tree": "b63e06f7a65f3ac2df09449bb65172644f230386",
      "parents": [
        "ba117e4172fe6f160bf5f4d58b37e12c08c34245"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Jan 16 13:13:22 2013 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Jan 16 13:16:42 2013 -0800"
      },
      "message": "Revert \"stack protector: use AT_RANDOM\"\n\nThe AT_RANDOM changes broke setuid / setgid executables\nsuch as \"ping\". When the linker executes a setuid program,\nit cleans the environment, removing any invalid environment\nentries, and adding \"NULL\"s to the end of the environment\narray for each removed variable. Later on, we try to determine\nthe location of the aux environment variable, and get tripped\nup by these extra NULLs.\n\nReverting this patch will get setuid executables working again,\nbut getauxval() is still broken for setuid programs because of\nthis bug.\n\nThis reverts commit e3a49a8661125f24aec8a1453e54b3b78005e21e.\n\nChange-Id: I05c58a896b1fe32cfb5d95d43b096045cda0aa4a\n"
    },
    {
      "commit": "e3a49a8661125f24aec8a1453e54b3b78005e21e",
      "tree": "a6a1be7dbdf1901db051fcfa1bd19f823e7a7f2b",
      "parents": [
        "14e1975e13c197180ed0481f305f83a362b16a24"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Jan 14 14:46:26 2013 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Jan 16 10:09:52 2013 -0800"
      },
      "message": "stack protector: use AT_RANDOM\n\nPopulate the stack canaries from the kernel supplied\nAT_RANDOM value, which doesn\u0027t involve any system calls.\nThis is slightly faster (6 fewer syscalls) and avoids\nunnecessarily reading /dev/urandom, which depletes entropy.\n\nBug: 7959813\n\nChange-Id: If2b43100a2a9929666df3de56b6139fed969e0f1\n"
    },
    {
      "commit": "2c5153b043b44e9935a334ae9b2d5a4bc5258b40",
      "tree": "a416a91052c38633d963fb5fc193356ae0c45640",
      "parents": [
        "69c89942db2ed472c71aa84903d0259cc84aa074"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jan 11 14:43:05 2013 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jan 11 16:44:15 2013 -0800"
      },
      "message": "libc: add getauxval()\n\nAdd support for getauxval().  This method allows a program an easy way\nto retrieve information from the kernel auxiliary vector, and will\nhopefully replace other clumsy ways of accessing this same information.\n\nThis particular function was also added to glibc in glibc 2.16.\nSee the following URLs for more details.\n\n  * http://lwn.net/Articles/519085/\n  * http://www.gnu.org/software/libc/manual/html_node/Auxiliary-Vector.html\n\nThis change is a prerequisite for bug 7959813.\n\nBug: http://code.google.com/p/android/issues/detail?id\u003d38441\nChange-Id: Iba19d899df334bddc6f4899077ece2fc87564ea8\n"
    },
    {
      "commit": "4f251bee5d51228217c1bf4dfc9219f3058bd3ed",
      "tree": "3d0f1faef6a38e494f8157e467e7fc0f876f6cd4",
      "parents": [
        "064f862d557ab741575dfae479499a07ca0ab742"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 01 16:33:29 2012 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 01 17:27:07 2012 -0700"
      },
      "message": "Don\u0027t corrupt the thread list if the main thread exits.\n\n...and don\u0027t pass a non-heap pointer to free(3), either.\n\nThis patch replaces the \"node** prev\" with the clearer \"node* prev\"\nstyle and fixes the null pointer dereference in the old code. That\u0027s\nnot sufficient to fix the reporter\u0027s bug, though. The pthread_internal_t*\nfor the main thread isn\u0027t heap-allocated --- __libc_init_tls causes a\npointer to a statically-allocated pthread_internal_t to be added to\nthe thread list.\n\nBug: http://code.google.com/p/android/issues/detail?id\u003d37410\nChange-Id: I112b7f22782fc789d58f9c783f7b323bda8fb8b7\n"
    },
    {
      "commit": "bfeab1bbe7e8d0c08b7e3f46aedab64e3b2bf706",
      "tree": "d7ee2fec0079394cfacebdc632036a53f079c011",
      "parents": [
        "ff4608ae0cb78caa05b83e109fc2633682958089"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 05 17:47:37 2012 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 05 17:47:37 2012 -0700"
      },
      "message": "Don\u0027t corrupt the thread list in static executables.\n\nSeveral previous changes conspired to make a mess of the thread list\nin static binaries. This was most obvious when trying to call\npthread_key_delete(3) on the main thread.\n\nBug: http://code.google.com/p/android/issues/detail?id\u003d36893\nChange-Id: I2a2f553114d8fb40533c481252b410c10656da2e\n"
    },
    {
      "commit": "e1dd3c287ba836281de0197670018bd9bbfbd62b",
      "tree": "a5138cb21c8de6be4ea4be61e44f95fb8bcb776e",
      "parents": [
        "7d2e24eb167b6257f7935c7bd2023a708704ca1a"
      ],
      "author": {
        "name": "Iliyan Malchev",
        "email": "malchev@google.com",
        "time": "Tue May 29 14:22:42 2012 -0700"
      },
      "committer": {
        "name": "Iliyan Malchev",
        "email": "malchev@google.com",
        "time": "Fri Jun 01 15:54:34 2012 -0700"
      },
      "message": "bionic: import heaptracker as chk_malloc\n\nThis patch is a rewrite of libc.debug.malloc \u003d 10 (chk_malloc).  It provides\nthe same features as the original (poison freed memory, detect heap overruns\nand underruns), except that it provides more debugging information whenever it\ndetects a problem.\n\nIn addition to the original features, the new chk_malloc() implementation\ndetects multiple frees within a given range of the last N allocations, N being\nconfigurable via the system property libc.debug.malloc.backlog.\n\nFinally, this patch keeps track of all outstanding memory allocations.  On\nprogram exit, we walk that list and report each outstanding allocation.\n\n(There is support (not enabled) for a scanner thread periodically walks over\nthe list of outstanding allocations as well as the backlog of recently-freed\nallocations, checking for heap-usage errors.)\n\nFeature overview:\n\n  1) memory leaks\n  2) multiple frees\n  3) use after free\n  4) overrun\n\nImplementation:\n\n-- for each allocation, there is a:\n  1) stack trace at the time the allocation is made\n  2) if the memory is freed, there is also a stack trace at the point\n  3) a front and rear guard (fence)\n  4) the stack traces are kept together with the allocation\n\n-- the following lists and maintained\n\n  1) all outstanding memory allocations\n  3) a backlog of allocations what are freed; when you call free(), instead of\n     actually freed, the allocation is moved to this backlog;\n  4) when the backlog of allocations gets full, the oldest entry gets evicted\n     from it; at that point, the allocation is checked for overruns or\n     use-after-free errors, and then actually freed.\n  5) when the program exits, the list of outstanding allocations and the\n     backlog are inspected for errors, then freed;\n\nTo use this, set the following system properties before running the process or\nprocesses you want to inspect:\n\nlibc.malloc.debug.backlog # defaults to 100\nlibc.malloc.debug 10\n\nWhen a problem is detected, you will see the following on logcat for a multiple\nfree:\n\nE/libc    ( 7233): +++ ALLOCATION 0x404b9278 SIZE 10 BYTES MULTIPLY FREED!\nE/libc    ( 7233): +++ ALLOCATION 0x404b9278 SIZE 10 ALLOCATED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c658  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d80  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 4009647c  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\nE/libc    ( 7233): +++ ALLOCATION 0x404b9278 SIZE 10 FIRST FREED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c7d2  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d94  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 40096490  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\nE/libc    ( 7233): +++ ALLOCATION 0x404b9278 SIZE 10 NOW BEING FREED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c6ac  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d94  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 400964a0  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\n\nThe following for a heap overrun and underrun:\n\nE/libc    ( 7233): +++ REAR GUARD MISMATCH [10, 11)\nE/libc    ( 7233): +++ ALLOCATION 0x404b9198 SIZE 10 HAS A CORRUPTED REAR GUARD\nE/libc    ( 7233): +++ ALLOCATION 0x404b9198 SIZE 10 ALLOCATED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c658  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d80  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 40096438  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\nE/libc    ( 7233): +++ ALLOCATION 0x404b9198 SIZE 10 FREED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c7d2  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d94  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 40096462  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\nE/libc    ( 7233): +++ ALLOCATION 0x404b9358 SIZE 10 HAS A CORRUPTED FRONT GUARD\nE/libc    ( 7233): +++ ALLOCATION 0x404b9358 SIZE 10 ALLOCATED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c658  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d80  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 400964ba  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\nE/libc    ( 7233): +++ ALLOCATION 0x404b9358 SIZE 10 FREED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c7d2  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d94  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 400964e4  /system/bin/malloctest\nE/libc    ( 7233):      #04  pc 00016f24  /system/lib/libc.so\n\nThe following for a memory leak:\n\nE/libc    ( 7233): +++ THERE ARE 1 LEAKED ALLOCATIONS\nE/libc    ( 7233): +++ DELETING 4096 BYTES OF LEAKED MEMORY AT 0x404b95e8 (1 REMAINING)\nE/libc    ( 7233): +++ ALLOCATION 0x404b95e8 SIZE 4096 ALLOCATED HERE:\nE/libc    ( 7233): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\nE/libc    ( 7233):      #00  pc 0000c35a  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #01  pc 0000c658  /system/lib/libc_malloc_debug_leak.so\nE/libc    ( 7233):      #02  pc 00016d80  /system/lib/libc.so\nE/libc    ( 7233):      #03  pc 0001bc94  /system/lib/libc.so\nE/libc    ( 7233):      #04  pc 0001edf6  /system/lib/libc.so\nE/libc    ( 7233):      #05  pc 0001b80a  /system/lib/libc.so\nE/libc    ( 7233):      #06  pc 0001c086  /system/lib/libc.so\nE/libc    ( 7233):      #07  pc 40096402  /system/bin/malloctest\nE/libc    ( 7233):      #08  pc 00016f24  /system/lib/libc.so\n\nChange-Id: Ic440e9d05a01e2ea86b25e8998714e88bc2d16e0\nSigned-off-by: Iliyan Malchev \u003cmalchev@google.com\u003e\n"
    },
    {
      "commit": "1a78fbb5c8228e4aea2a516818828b76044310f2",
      "tree": "4de785711dbfa8923d721f9180473328b6228a5c",
      "parents": [
        "d5099016f70b5acbfeb969787687099df703a4f4"
      ],
      "author": {
        "name": "Evgeniy Stepanov",
        "email": "eugenis@google.com",
        "time": "Thu Mar 22 18:01:53 2012 +0400"
      },
      "committer": {
        "name": "Evgeniy Stepanov",
        "email": "eugenis@google.com",
        "time": "Fri Apr 13 00:08:11 2012 +0400"
      },
      "message": "Initialize TLS before any application code is run.\n\nSince e19d702b8e33, dlsym and friends use recursive mutexes that\nrequire the current thread id, which is not available before the libc\nconstructor. This prevents us from using dlsym() in .preinit_array.\n\nThis change moves TLS initialization from libc constructor to the earliest\npossible point - immediately after linker itself is relocated. As a result,\npthread_internal_t for the initial thread is available from the start.\n\nAs a bonus, values stored in TLS in .preinit_array are not lost when libc is\ninitialized.\n\nChange-Id: Iee5a710ee000173bff63e924adeb4a4c600c1e2d\n"
    },
    {
      "commit": "f7ad13b0ce5ad2d2f0340c066b09eb8174877739",
      "tree": "21a0fc62890f7df4b1315fc41f298ce8fd5bcc9e",
      "parents": [
        "aeb41ec103103c37bf4a1700de714d9ff1befe8e",
        "1df986c21ee52c6756846b4a5e45cb316f772112"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 21 09:43:19 2010 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Oct 21 09:43:19 2010 -0700"
      },
      "message": "am 1df986c2: libc: fix executable destruction support.\n\nMerge commit \u00271df986c21ee52c6756846b4a5e45cb316f772112\u0027 into gingerbread-plus-aosp\n\n* commit \u00271df986c21ee52c6756846b4a5e45cb316f772112\u0027:\n  libc: fix executable destruction support.\n"
    },
    {
      "commit": "1df986c21ee52c6756846b4a5e45cb316f772112",
      "tree": "da7effa96dd8e57e1cd718e69b79827d9011038e",
      "parents": [
        "d3f0638aeec0b1daf4d3347386a5e441d5a4bcc4"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 21 04:16:50 2010 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 21 04:16:50 2010 +0200"
      },
      "message": "libc: fix executable destruction support.\n\nThis change allows an executable to call its destructor functions\n(declared with __attribute__((destructor))) to be properly called\nwhen it normally exits.\n\nNote that this is different from calling the destructors of a shared\nlibrary when it is unloaded with dlclose() or through program exit,\nwhich are already supported.\n\nBug: 3106500\nChange-Id: I1412ef5407f13b613fc6cb6103e0a691dbee4b1a\n"
    },
    {
      "commit": "2bf607d599b703604cb1caf5beeb2e70c44682fb",
      "tree": "5bb144406d077dcea82fd18fc4003a644105b8ec",
      "parents": [
        "e8f79c1f5de7ecaf1249ee36813abd2558cacf08"
      ],
      "author": {
        "name": "Chris Peterson",
        "email": "cpeterso@cpeterso.com",
        "time": "Sun Jun 27 20:53:04 2010 -0700"
      },
      "committer": {
        "name": "Chris Peterson",
        "email": "cpeterso@cpeterso.com",
        "time": "Sun Jun 27 20:53:04 2010 -0700"
      },
      "message": "Change-Id: I68cc462aeb2460345a53bdb9941ce4bfc10456fb\nbionic: fix clearenv() compiler warning and related comment typos\n"
    },
    {
      "commit": "39f3745cf30efe38482ffead1c32f4e62f6fe32e",
      "tree": "c7ae2dcba7dd282d787961a641720dce723172ea",
      "parents": [
        "b56b5659b3996e98c2060f168d1cff1474e77d2a"
      ],
      "author": {
        "name": "Andy McFadden",
        "email": "fadden@android.com",
        "time": "Tue Jul 21 15:25:23 2009 -0700"
      },
      "committer": {
        "name": "Andy McFadden",
        "email": "fadden@android.com",
        "time": "Tue Jul 21 15:44:23 2009 -0700"
      },
      "message": "Restore malloc debug.\n\nSome libc changes were preventing the initialization call from being made.\nThe basic problem appears to be that libc_init_common.c is only built once,\nand it\u0027s only built for the non-debug libc.\n"
    },
    {
      "commit": "b56b5659b3996e98c2060f168d1cff1474e77d2a",
      "tree": "11135868d3dc4a731f7288bcb00abdf48c5c7202",
      "parents": [
        "ef0bd1857041ffde069cf52138aaf22c1af7130e"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Jul 18 01:11:10 2009 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Jul 18 01:11:10 2009 +0200"
      },
      "message": "Fix the C library runtime initialization order.\n\nThis allows libc.so to run the C runtime initializer as soon as the\ndynamic linker loads the shared library, i.e. before any other initializers\n(e.g. static C++ constructors in other shared libraries the executable depends\non).\n\nThis also removes the bug where the initializers from the executable itself\nwere run twice: once by the dynamic linker, and another time by __libc_init\nas defined by libc_init_dynamic.c\n"
    },
    {
      "commit": "3a654b1e04d4275ae315cfe1b196998acf10052c",
      "tree": "79ce08ac573c6c5bd7d7a65f7fdc24237c00452a",
      "parents": [
        "03eabfe65e1e2c36f4d26c78a730fa19a3bdada3"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jun 03 19:32:37 2009 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jun 03 19:32:37 2009 +0200"
      },
      "message": "Revert \"Fix the C library initialization to avoid calling static C++ constructors twice.\"\n\nThis reverts commit 03eabfe65e1e2c36f4d26c78a730fa19a3bdada3.\n"
    },
    {
      "commit": "03eabfe65e1e2c36f4d26c78a730fa19a3bdada3",
      "tree": "b965ea27e54b0833639227c619f6e35647c92510",
      "parents": [
        "0353195f344666256dba474a15c9ba22cf0cccc9"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu May 28 15:54:03 2009 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Jun 02 23:27:44 2009 +0200"
      },
      "message": "Fix the C library initialization to avoid calling static C++ constructors twice.\n\nThe problem was due to the fact that, in the case of dynamic executables,\nthe dynamic linker calls the DT_PREINIT_ARRAY, DT_INIT and DT_INIT_ARRAY\nconstructors when loading shared libraries and dynamic executables,\n*before* calling the executable\u0027s entry point (i.e. arch-$ARCH/bionic/crtbegin_dynamic.c)\nwhich in turns call __libc_init() in libc.so, as defined by bionic/libc_init_dynamic.c\n\nThe latter did call these constructors array again, mistakenly.\n\nThe patch also updates the documentation of many related functions.\n\nAlso adds a new section to linker/README.TXT explaining restrictions on\nC library usage.\n\nThe patch has been tested on a Dream for stability issues with\nproprietary blobs:\n\n- H264 decoding works\n- Camera + Video recording works\n- GPS works\n- Sensors work\n\nThe tests in system/extra/tests/bionic/libc/common/test_static_cpp_mutex.cpp has been\nrun and shows the static C++ constructor being called only once.\n"
    },
    {
      "commit": "1dc9e472e19acfe6dc7f41e429236e7eef7ceda1",
      "tree": "3be0c520fae17689bbf5584e1136fb820caef26f",
      "parents": [
        "1767f908af327fa388b1c66883760ad851267013"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "1767f908af327fa388b1c66883760ad851267013",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "a799b53f10e5a6fd51fef4436cfb7ec99836a516"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "e5cc1f386b167b9f7bfdebc7219e89aa9b71e4b2",
      "tree": "2cbd43daa6744ed80e833528f8cbfc0c485e5253",
      "parents": [
        "6d6c82c7a0a6b9a89f61b61c66f9b90d9c7177dc"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 15 16:12:07 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 15 16:12:07 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@126645\n"
    },
    {
      "commit": "a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349",
      "tree": "defd1cc07d16ad2f3b21154114e092d11c94c5bb",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
