Commit 0b0dd831 authored by Gabriele Svelto's avatar Gabriele Svelto
Browse files

Bug 1752703 - Move the pthread_thread_create() interposer under mozglue and...

Bug 1752703 - Move the pthread_thread_create() interposer under mozglue and prepare for having a single place where we place interposer functions r=glandium

Differential Revision: https://phabricator.services.mozilla.com/D164470
parent b0f78a8a
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -53,11 +53,6 @@ LOCAL_INCLUDES += [
    "/xpcom/build",
]

# The pthred_create() interposer needs to be linked as early as possible so
# that it will appear before libpthread when resolving symbols.
if CONFIG["OS_ARCH"] == "Linux" and CONFIG["MOZ_CRASHREPORTER"]:
    USE_LIBS += ["pthread_create_interposer"]

if CONFIG["LIBFUZZER"]:
    USE_LIBS += ["fuzzer"]
    LOCAL_INCLUDES += [
+0 −5
Original line number Diff line number Diff line
@@ -16,11 +16,6 @@ else:
        "MozillaRuntimeMain.cpp",
    ]

# The pthred_create() interposer needs to be linked as early as possible so
# that it will appear before libpthread when resolving symbols.
if CONFIG["OS_ARCH"] == "Linux" and CONFIG["MOZ_CRASHREPORTER"]:
    USE_LIBS += ["pthread_create_interposer"]

include("/ipc/chromium/chromium-config.mozbuild")

LOCAL_INCLUDES += [
+1 −0
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ rsync_filter_list = """

+ /mozglue/baseprofiler/**
+ /mozglue/build/**
+ /mozglue/interposers/**
+ /mozglue/misc/**
+ /mozglue/moz.build
+ /mozglue/static/**
+0 −5
Original line number Diff line number Diff line
@@ -10,11 +10,6 @@ SOURCES += [
    "xpcshell.cpp",
]

# The pthred_create() interposer needs to be linked as early as possible so
# that it will appear before libpthread when resolving symbols.
if CONFIG["OS_ARCH"] == "Linux" and CONFIG["MOZ_CRASHREPORTER"]:
    USE_LIBS += ["pthread_create_interposer"]

if CONFIG["LIBFUZZER"]:
    USE_LIBS += ["fuzzer"]

+66 −0
Original line number Diff line number Diff line
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef InterposerHelper_h
#define InterposerHelper_h

#include <type_traits>

#ifdef MOZ_LINKER
#  include "Linker.h"
#else
#  include <dlfcn.h>
#endif

#include "mozilla/Assertions.h"

template <typename T>
static inline T dlsym_wrapper(void* aHandle, const char* aName) {
#ifdef MOZ_LINKER
  return reinterpret_cast<T>(__wrap_dlsym(aHandle, aName));
#else
  return reinterpret_cast<T>(dlsym(aHandle, aName));
#endif  // MOZ_LINKER
}

template <typename T>
static T get_real_symbol(const char* aName, T aReplacementSymbol) {
  // T can only be a function pointer
  static_assert(std::is_function<typename std::remove_pointer<T>::type>::value);

  // Find the corresponding function in the linked libraries
  T real_symbol = dlsym_wrapper<T>(RTLD_NEXT, aName);

#if defined(ANDROID)
  if (real_symbol == nullptr) {
    // On old versions of Android the application runtime links in libc before
    // we get a chance to link libmozglue, so its symbols don't appear when
    // resolving them with RTLD_NEXT but rather with RTLD_DEFAULT. If RTLD_NEXT
    // failed to find a symbol we try again with RTLD_DEFAULT. The checks below
    // make sure that we crash in case the symbol we get matches the
    // replacement one so this is safe albeit a bit weird.
    real_symbol = dlsym_wrapper<T>(RTLD_DEFAULT, aName);
  }
#endif

  if (real_symbol == nullptr) {
    MOZ_CRASH_UNSAFE_PRINTF(
        "%s() interposition failed but the interposer function is "
        "still being called, this won't work!",
        aName);
  }

  if (real_symbol == aReplacementSymbol) {
    MOZ_CRASH_UNSAFE_PRINTF(
        "We could not obtain the real %s(). Calling the symbol we "
        "got would make us enter an infinite loop so stop here instead.",
        aName);
  }

  return real_symbol;
}

#define GET_REAL_SYMBOL(name) get_real_symbol(#name, name)

#endif  // InterposerHelper_h
Loading