Skip to content

Commit

Permalink
[CMake] Support stripping and linking output to .build-id directory
Browse files Browse the repository at this point in the history
When installing runtimes with install-runtimes-stripped, we don't want
to just strip them, we also want to preserve the debugging information
for potential debugging. To make it possible to later find the stripped
debugging information, we want to use the .build-id layout:

https://fedoraproject.org/wiki/RolandMcGrath/BuildID#Find_files_by_build_ID

That is, for libfoo.so with build ID abcdef1234, the debugging information
will be installed into lib/debug/.build-id/ab/cdef1234. llvm-objcopy
already has support for stripping files and linking the debugging
stripped output into the right location. However, CMake doesn't support
customizing strip invocation for the *-stripped targets. So instead, we
replace CMAKE_STRIP with a custom script that invokes llvm-objcopy with
the right command line flags.

Differential Revision: https://reviews.llvm.org/D59127

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355765 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
petrhosek committed Mar 9, 2019
1 parent 2473ad9 commit 308cadd
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
10 changes: 8 additions & 2 deletions cmake/modules/LLVMExternalProjectUtils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,14 @@ endfunction()
# Extra targets in the subproject to generate targets for
# PASSTHROUGH_PREFIXES prefix...
# Extra variable prefixes (name is always included) to pass down
# STRIP_TOOL path
# Use provided strip tool instead of the default one.
# )
function(llvm_ExternalProject_Add name source_dir)
cmake_parse_arguments(ARG
"USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
"SOURCE_DIR"
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES"
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL"
${ARGN})
canonicalize_tool_name(${name} nameCanon)
if(NOT ARG_TOOLCHAIN_TOOLS)
Expand Down Expand Up @@ -125,12 +127,16 @@ function(llvm_ExternalProject_Add name source_dir)
if(llvm-objcopy IN_LIST TOOLCHAIN_TOOLS)
list(APPEND compiler_args -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy)
endif()
if(llvm-strip IN_LIST TOOLCHAIN_TOOLS)
if(llvm-strip IN_LIST TOOLCHAIN_TOOLS AND NOT ARG_STRIP_TOOL)
list(APPEND compiler_args -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip)
endif()
list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS})
endif()

if(ARG_STRIP_TOOL)
list(APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL})
endif()

add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
DEPENDS ${ARG_DEPENDS}
Expand Down
12 changes: 12 additions & 0 deletions runtimes/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,14 @@ else() # if this is included from LLVM's CMake
list(APPEND runtime_names ${projName})
endforeach()

if(LLVM_RUNTIME_BUILD_ID_LINK_TARGETS)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/llvm-strip-link.in
${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link
@ONLY
)
endif()

function(runtime_default_target)
cmake_parse_arguments(ARG "" "" "DEPENDS;PREFIXES" ${ARGN})

Expand Down Expand Up @@ -426,6 +434,10 @@ else() # if this is included from LLVM's CMake
endif()
endforeach()

if(target IN_LIST LLVM_RUNTIME_BUILD_ID_LINK_TARGETS)
list(APPEND EXTRA_ARGS STRIP_TOOL ${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link)
endif()

llvm_ExternalProject_Add(runtimes-${name}
${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${${name}_deps}
Expand Down
27 changes: 27 additions & 0 deletions runtimes/llvm-strip-link.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import subprocess


ELF_MAGIC = '\x7fELF'

with open(sys.argv[1], "rb") as f:
buf = f.read(len(ELF_MAGIC))
if buf != ELF_MAGIC:
sys.exit(0)

llvm_objcopy = os.path.join('@LLVM_RUNTIME_OUTPUT_INTDIR@', 'llvm-objcopy')
install_dir = os.path.join(os.getenv('DESTDIR', ''), '@CMAKE_INSTALL_PREFIX@')
link_dir = os.path.join(install_dir, 'lib', 'debug', '.build-id')

sys.exit(subprocess.call([
llvm_objcopy,
'--strip-sections',
'--build-id-link-dir=' + link_dir,
'--build-id-link-input=.debug',
'--build-id-link-output=',
sys.argv[1],
]))

0 comments on commit 308cadd

Please sign in to comment.