diff options
author | Jan Vorlicek <janvorli@microsoft.com> | 2020-04-15 14:19:41 +0300 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2020-04-18 12:18:05 +0300 |
commit | aec231da54ef8b45ebfb88cb9626cda0780261a7 (patch) | |
tree | fd1d969367ff41b01303a483ee35f61d083b2f2d /eng/native | |
parent | cf66f084ca8b563c42cd814e8ce8b03519af51bd (diff) |
Implement native GetModuleIndex
This change replaces managed GetModuleIndex tool by shell scripts using
native tools.
Diffstat (limited to 'eng/native')
-rw-r--r-- | eng/native/functions.cmake | 25 | ||||
-rw-r--r-- | eng/native/genmoduleindex.cmd | 25 | ||||
-rwxr-xr-x | eng/native/genmoduleindex.sh | 29 |
3 files changed, 79 insertions, 0 deletions
diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake index b7f8f463804..b422fc7c7c8 100644 --- a/eng/native/functions.cmake +++ b/eng/native/functions.cmake @@ -415,3 +415,28 @@ endfunction() function(add_executable_clr) _add_executable(${ARGV}) endfunction() + +function(generate_module_index Target ModuleIndexFile) + if(CLR_CMAKE_HOST_WIN32) + set(scriptExt ".cmd") + else() + set(scriptExt ".sh") + endif() + + add_custom_command( + OUTPUT ${ModuleIndexFile} + COMMAND ${CLR_ENG_NATIVE_DIR}/genmoduleindex${scriptExt} $<TARGET_FILE:${Target}> ${ModuleIndexFile} + DEPENDS ${Target} + COMMENT "Generating ${Target} module index file -> ${ModuleIndexFile}" + ) + + set_source_files_properties( + ${ModuleIndexFile} + PROPERTIES GENERATED TRUE + ) + + add_custom_target( + ${Target}_module_index_header + DEPENDS ${ModuleIndexFile} + ) +endfunction(generate_module_index) diff --git a/eng/native/genmoduleindex.cmd b/eng/native/genmoduleindex.cmd new file mode 100644 index 00000000000..a6be851461a --- /dev/null +++ b/eng/native/genmoduleindex.cmd @@ -0,0 +1,25 @@ +@echo off +REM Generate module index header + +if [%1]==[] goto :Usage +if [%2]==[] goto :Usage + +setlocal +for /f "tokens=1" %%i in ('dumpbin /HEADERS %1 ^| findstr /c:"size of image"') do set imagesize=%%i +REM Pad the extracted size to 8 hex digits +set imagesize=00000000%imagesize% +set imagesize=%imagesize:~-8% + +for /f "tokens=1" %%i in ('dumpbin /HEADERS %1 ^| findstr /c:"time date"') do set timestamp=%%i +REM Pad the extracted time stamp to 8 hex digits +set timestamp=00000000%timestamp% +set timestamp=%timestamp:~-8% + +echo 0x08, 0x%timestamp:~6,2%, 0x%timestamp:~4,2%, 0x%timestamp:~2,2%, 0x%timestamp:~0,2%, 0x%imagesize:~6,2%, 0x%imagesize:~4,2%, 0x%imagesize:~2,2%, 0x%imagesize:~0,2%, > %2 + +endlocal +exit /b 0 + +:Usage +echo Usage: genmoduleindex.cmd ModuleBinaryFile IndexHeaderFile +exit /b 1 diff --git a/eng/native/genmoduleindex.sh b/eng/native/genmoduleindex.sh new file mode 100755 index 00000000000..77ead1cc8bd --- /dev/null +++ b/eng/native/genmoduleindex.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# +# Generate module index header +# +set -euo pipefail + +if [[ "$#" -lt 2 ]]; then + echo "Usage: genmoduleindex.sh ModuleBinaryFile IndexHeaderFile" + exit 1 +fi + +OSName=$(uname -s) + +case "$OSName" in +Darwin) + # Extract the build id and prefix it with its length in bytes + dwarfdump -u $1 | + awk '/UUID:/ { gsub(/\-/,"", $2); printf("%02x", length($2)/2); print $2}' | + # Convert each byte of the id to 0x prefixed constant followed by comma + sed -E s/\(\.\.\)/0x\\1,\ /g > $2 + ;; +*) + # Extract the build id and prefix it with its length in bytes + readelf -n $1 | + awk '/Build ID:/ { printf("%02x", length($3)/2); print $3 }' | + # Convert each byte of the id to 0x prefixed constant followed by comma + sed -E s/\(\.\.\)/0x\\1,\ /g > $2 + ;; +esac |