)]}'
{
  "commit": "23833dc15246606497934ab49ea36fb5b4eca6a1",
  "tree": "75e6e8cccdeac1e67418e6179b620cd43e5a0aaf",
  "parents": [
    "433b282f05aa731daed96ff0c6686e90d7527aed"
  ],
  "author": {
    "name": "Barret Rhoden",
    "email": "brho@cs.berkeley.edu",
    "time": "Wed Aug 30 13:20:48 2017 -0400"
  },
  "committer": {
    "name": "Barret Rhoden",
    "email": "brho@cs.berkeley.edu",
    "time": "Wed Aug 30 13:51:41 2017 -0400"
  },
  "message": "parlib: Fix dlopen() with -rdynamic\n\nPart 3 of trying to fix shared objects, following up on commit c77d5ade84b7\n(\"parlib: Fix fake parlib detection for dlopen() (XCC)\").\n\nIf we use -rdynamic, all symbols from the binary (e.g. hello.c) will\noverride functions in the .so.  For instance, __in_fake_parlib() and\nvcore_lib_init() will be from the binary, not the .so, even when we\u0027re\nrunning the library\u0027s ctors.\n\nThe fix is relatively simple: __in_fake_parlib() is a static inline, which\nwon\u0027t give the opportunity for the .so to link against a global version,\nsince there is no global version.\n\nFor the ctors, we actually could leave vcore_lib_init() as a global ctor,\nsince it can safely be called multiple times.  But that\u0027s a little sloppy\nand confusing - I wondered for a little while why vcore_lib_init() ran from\nhello, while uthread_lib_init() was run from within the .so.  static vs\nglobal.  We still need the guts vcore_lib_init() to be in a header for\nuthread.c, so the sanest thing was to just split it up.\n\nSigned-off-by: Barret Rhoden \u003cbrho@cs.berkeley.edu\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "54eaad4c819d5693cc50226ea932c28f360fdfad",
      "old_mode": 33188,
      "old_path": "user/parlib/alarm.c",
      "new_id": "b11accdb0de695ca7112b31f30926dc8c0688724",
      "new_mode": 33188,
      "new_path": "user/parlib/alarm.c"
    },
    {
      "type": "modify",
      "old_id": "6e8f2efe53c0d7a53ab7d603d64d62f2ae7d33e8",
      "old_mode": 33188,
      "old_path": "user/parlib/include/parlib/vcore.h",
      "new_id": "242902e8c76cf79c730e854e2d3886273079d0a7",
      "new_mode": 33188,
      "new_path": "user/parlib/include/parlib/vcore.h"
    },
    {
      "type": "modify",
      "old_id": "dc796f5edeac24e41b1a2a2ff361e6e5e961304c",
      "old_mode": 33188,
      "old_path": "user/parlib/panic.c",
      "new_id": "44e992e5b17d3ae1fba054c77022ad9799b07aef",
      "new_mode": 33188,
      "new_path": "user/parlib/panic.c"
    },
    {
      "type": "modify",
      "old_id": "5f5ec9e9647e6b5a5862dd554beeb3c10ee80264",
      "old_mode": 33188,
      "old_path": "user/parlib/uthread.c",
      "new_id": "85f7ea01221e5c76cb31820d97dc3e01e0c55609",
      "new_mode": 33188,
      "new_path": "user/parlib/uthread.c"
    },
    {
      "type": "modify",
      "old_id": "3a29c65869c00120d595d9e5ad24071ec3289296",
      "old_mode": 33188,
      "old_path": "user/parlib/vcore.c",
      "new_id": "32c89e3ecff2a82d7ce5e09ecbf3294670c5639f",
      "new_mode": 33188,
      "new_path": "user/parlib/vcore.c"
    },
    {
      "type": "modify",
      "old_id": "fcd9e1d3e029931ba398bbc54199991e430c017b",
      "old_mode": 33188,
      "old_path": "user/parlib/vcore_tick.c",
      "new_id": "7df2e5f911ebb4b0649249f31997d9eb8b942076",
      "new_mode": 33188,
      "new_path": "user/parlib/vcore_tick.c"
    }
  ]
}
