summaryrefslogtreecommitdiff
path: root/cmake/FindObjcopyWithWeaken.cmake
blob: 95c81da398e5a960767f3d01963b9f3c4a4bc9e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function(find_objcopy_with_weaken)
  find_program(OBJCOPY_EXECUTABLE "objcopy")
  message(STATUS "Looking for objcopy that supports weaken - ${OBJCOPY_EXECUTABLE}")
  if(NOT OBJCOPY_EXECUTABLE)
    return()
  endif()
  set(objcopy_test_src "${CMAKE_CURRENT_BINARY_DIR}/objcopy_test.c")
  set(objcopy_test_exe "${CMAKE_CURRENT_BINARY_DIR}/objcopy_test")
  file(WRITE ${objcopy_test_src} "void foo() {} int main() { return 0; }")
  try_compile(objcopy_test_compiled
          ${CMAKE_CURRENT_BINARY_DIR} ${objcopy_test_src}
          COPY_FILE ${objcopy_test_exe})
  if(objcopy_test_compiled AND EXISTS ${objcopy_test_exe})
    execute_process(
            COMMAND ${OBJCOPY_EXECUTABLE} -W foo ${objcopy_test_exe}
            RESULT_VARIABLE objcopy_result)
    file(REMOVE ${objcopy_test_exe})
  endif()
  if(objcopy_result EQUAL 0)
    set(objcopy_weaken ON)
  endif()
  file(REMOVE ${objcopy_test_src})
  if(objcopy_weaken)
    set(objcopy_has_weaken "Success")
    set(HAVE_OBJCOPY_WEAKEN TRUE PARENT_SCOPE)
    set(OBJCOPY_EXECUTABLE "${OBJCOPY_EXECUTABLE}" PARENT_SCOPE)
  else()
    set(objcopy_has_weaken "Failed")
  endif()
  message(STATUS "objcopy has weaken support - ${objcopy_has_weaken}")
endfunction(find_objcopy_with_weaken)

function(weaken_object target)
  if(NOT HAVE_OBJCOPY_WEAKEN)
      return()
  endif()
  # If we have objcopy, make malloc/free/etc weak symbols.  That way folks
  # can override our malloc if they want to (they can still use tc_malloc).
  # Note: the weird-looking symbols are the c++ memory functions:
  # (in order) new, new(nothrow), new[], new[](nothrow), delete, delete[]
  # In theory this will break if mangling changes, but that seems pretty
  # unlikely at this point.  Just in case, I throw in versions with an
  # extra underscore as well, which may help on OS X.
  add_custom_command(TARGET ${target} POST_BUILD
          COMMAND "${OBJCOPY_EXECUTABLE}"
          -W malloc -W free -W realloc -W calloc -W cfree
          -W memalign -W posix_memalign -W valloc -W pvalloc
          -W aligned_alloc
          -W malloc_stats -W mallopt -W mallinfo -W nallocx
          -W _Znwm -W _ZnwmRKSt9nothrow_t -W _Znam -W _ZnamRKSt9nothrow_t
          -W _ZdlPv -W _ZdaPv
          -W __Znwm -W __ZnwmRKSt9nothrow_t -W __Znam -W __ZnamRKSt9nothrow_t
          -W __ZdlPv -W __ZdaPv "$<TARGET_FILE:${target}>")
endfunction()