Implement native GetModuleIndex
authorJan Vorlicek <janvorli@microsoft.com>
Wed, 15 Apr 2020 11:19:41 +0000 (13:19 +0200)
committerJan Vorlicek <janvorli@microsoft.com>
Sat, 18 Apr 2020 09:18:05 +0000 (02:18 -0700)
This change replaces managed GetModuleIndex tool by shell scripts using
native tools.

eng/native/functions.cmake
eng/native/genmoduleindex.cmd [new file with mode: 0644]
eng/native/genmoduleindex.sh [new file with mode: 0755]
src/coreclr/src/debug/runtimeinfo/CMakeLists.txt
src/coreclr/src/dlls/mscordac/CMakeLists.txt
src/coreclr/src/dlls/mscordbi/CMakeLists.txt
src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt

index b7f8f463804ca6952b8a8170de9bbfafcf1c7c84..b422fc7c7c8c60b1b87e99da65c66b05d5491a76 100644 (file)
@@ -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 (file)
index 0000000..a6be851
--- /dev/null
@@ -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 (executable)
index 0000000..77ead1c
--- /dev/null
@@ -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
index 96a3d464b133665310f137797bfa2ee80725f7be..99b8f5edd08453a013b9333f801fd23292f0739c 100644 (file)
@@ -6,6 +6,6 @@ set(RUNTIMEINFO_SOURCES
 
 add_library_clr(runtimeinfo STATIC ${RUNTIMEINFO_SOURCES})
 
-add_dependencies(runtimeinfo runtime_module_index_header)
-add_dependencies(runtimeinfo dac_module_index_header)
-add_dependencies(runtimeinfo dbi_module_index_header)
+add_dependencies(runtimeinfo coreclr_module_index_header)
+add_dependencies(runtimeinfo mscordaccore_module_index_header)
+add_dependencies(runtimeinfo mscordbi_module_index_header)
index e8e9ef167291b6b6b4fb35aaa8e9a2dc7eb40531..3e2a6bdb2423144dc6cc278e83f54ebc1bcd2ba6 100644 (file)
@@ -190,24 +190,7 @@ target_link_libraries(mscordaccore PRIVATE ${COREDAC_LIBRARIES})
 # Create the DAC module index header file containing the DAC build id
 # for xplat and the timestamp/size on Windows.
 if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
-    set(
-        DAC_MODULE_INDEX_FILE 
-        ${GENERATED_INCLUDE_DIR}/dacmoduleindex.h
-    )
-    add_custom_command(
-        OUTPUT ${DAC_MODULE_INDEX_FILE}
-        COMMAND ${CLR_DOTNET_COMMAND} ${CMAKE_INSTALL_PREFIX}/GetModuleIndex/GetModuleIndex.dll $<TARGET_FILE:mscordaccore> ${DAC_MODULE_INDEX_FILE}
-        DEPENDS mscordaccore
-        COMMENT "Generating DAC module index file -> ${DAC_MODULE_INDEX_FILE}"
-    )
-    set_source_files_properties(
-        ${DAC_MODULE_INDEX_FILE} 
-        PROPERTIES GENERATED TRUE
-    )
-    add_custom_target(
-        dac_module_index_header
-        DEPENDS ${DAC_MODULE_INDEX_FILE} 
-    )
+    generate_module_index(mscordaccore ${GENERATED_INCLUDE_DIR}/dacmoduleindex.h)
 endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
 
 # add the install targets
index 6d189272c75ae54b1e620d59d74ec16f61a85e39..d3a695cee4af22c5f96e134ef25a37fabaabca98 100644 (file)
@@ -124,24 +124,7 @@ endif(CLR_CMAKE_HOST_WIN32)
 # Create the DBI module index header file containing the DBI build id
 # for xplat and the timestamp/size on Windows.
 if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
-    set(
-        DBI_MODULE_INDEX_FILE 
-        ${GENERATED_INCLUDE_DIR}/dbimoduleindex.h
-    )
-    add_custom_command(
-        OUTPUT ${DBI_MODULE_INDEX_FILE}
-        COMMAND ${CLR_DOTNET_COMMAND} ${CMAKE_INSTALL_PREFIX}/GetModuleIndex/GetModuleIndex.dll $<TARGET_FILE:mscordbi> ${DBI_MODULE_INDEX_FILE}
-        DEPENDS mscordbi
-        COMMENT "Generating DBI module index file -> ${DBI_MODULE_INDEX_FILE}"
-    )
-    set_source_files_properties(
-        ${DBI_MODULE_INDEX_FILE} 
-        PROPERTIES GENERATED TRUE
-    )
-    add_custom_target(
-        dbi_module_index_header
-        DEPENDS ${DBI_MODULE_INDEX_FILE} 
-    )
+    generate_module_index(mscordbi ${GENERATED_INCLUDE_DIR}/dbimoduleindex.h)
 endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
 
 # add the install targets
index 777a2869e4f7ce48cd32a636bf516f16d4339d57..52ec65fa73ba591fc6f9c7ab619f20fee8c0fa7d 100644 (file)
@@ -167,24 +167,7 @@ target_link_libraries(coreclr ${CORECLR_LIBRARIES})
 # Create the runtime module index header file containing the coreclr build id
 # for xplat and the timestamp/size on Windows.
 if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
-    set(
-        RUNTIME_MODULE_INDEX_FILE 
-        ${GENERATED_INCLUDE_DIR}/runtimemoduleindex.h
-    )
-    add_custom_command(
-        OUTPUT ${RUNTIME_MODULE_INDEX_FILE}
-        COMMAND ${CLR_DOTNET_COMMAND} ${CMAKE_INSTALL_PREFIX}/GetModuleIndex/GetModuleIndex.dll $<TARGET_FILE:coreclr> ${RUNTIME_MODULE_INDEX_FILE}
-        DEPENDS coreclr
-        COMMENT "Generating runtime module index file -> ${RUNTIME_MODULE_INDEX_FILE}"
-    )
-    set_source_files_properties(
-        ${RUNTIME_MODULE_INDEX_FILE} 
-        PROPERTIES GENERATED TRUE
-    )
-    add_custom_target(
-        runtime_module_index_header
-        DEPENDS ${RUNTIME_MODULE_INDEX_FILE} 
-    )
+    generate_module_index(coreclr ${GENERATED_INCLUDE_DIR}/runtimemoduleindex.h)
 endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
 
 if(CLR_CMAKE_TARGET_WIN32)