Skip to content

Commit b89e230

Browse files
authored
Add prefix to DAC's PAL exports for alpine (dotnet#18873)
Added some cmake logic to create assembly include mapping files. One that maps the prefixed name (DAC_foo) to the actual name (foo) which is included in the DAC module and another that maps the actual name to the prefixed name that is included in the SOS, DBI and createdump modules. The data exports like IID_IUnknown are not prefixed and don't need to be (immutable static data). There were some C++ exports functions exported with their decorated names in the CatchHardwareExceptionHolder and NativeExceptionHolderBase classes. Created PAL_* style export functions that implements the code. Fix lldb plugin cmake file to use LLDB_H/LLDB_LIB env vars to build it.
1 parent 0e22b10 commit b89e230

18 files changed

+483
-309
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ set(VM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/vm)
2525
set(GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/inc)
2626
set(GENERATED_EVENTING_DIR ${CMAKE_CURRENT_BINARY_DIR}/eventing)
2727
set(VERSION_FILE_PATH "${CMAKE_BINARY_DIR}/version.cpp")
28+
set(PAL_REDEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/src/dlls/mscordac/palredefines.S)
2829

2930
set(CORECLR_SET_RPATH ON)
3031
if(CORECLR_SET_RPATH)

functions.cmake

+21
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,27 @@ function(generate_exports_file)
107107
PROPERTIES GENERATED TRUE)
108108
endfunction()
109109

110+
function(generate_exports_file_prefix inputFilename outputFilename prefix)
111+
112+
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
113+
set(AWK_SCRIPT generateexportedsymbols.awk)
114+
else()
115+
set(AWK_SCRIPT generateversionscript.awk)
116+
if (NOT ${prefix} STREQUAL "")
117+
set(AWK_VARS ${AWK_VARS} -v prefix=${prefix})
118+
endif()
119+
endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
120+
121+
add_custom_command(
122+
OUTPUT ${outputFilename}
123+
COMMAND ${AWK} -f ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT} ${AWK_VARS} ${inputFilename} >${outputFilename}
124+
DEPENDS ${inputFilename} ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT}
125+
COMMENT "Generating exports file ${outputFilename}"
126+
)
127+
set_source_files_properties(${outputFilename}
128+
PROPERTIES GENERATED TRUE)
129+
endfunction()
130+
110131
function(add_precompiled_header header cppFile targetSources)
111132
if(MSVC)
112133
set(precompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/stdafx.pch")

generateexportedsymbols.awk

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
{
2-
# Remove the CR character in case the sources are mapped from
3-
# a Windows share and contain CRLF line endings
4-
gsub(/\r/,"", $0);
2+
# Remove the CR character in case the sources are mapped from
3+
# a Windows share and contain CRLF line endings
4+
gsub(/\r/,"", $0);
55

6-
# Skip empty lines and comment lines starting with semicolon
7-
if (NF && !match($0, /^[:space:]*;/))
8-
{
9-
print "_" $0;
10-
}
6+
# Skip empty lines and comment lines starting with semicolon
7+
if (NF && !match($0, /^[:space:]*;/))
8+
{
9+
gsub(/^#/,"", $0);
10+
print "_" $0;
11+
}
1112
}

generateredefinesfile.awk

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# "jump" is the jump instruction for the platform
2+
# "prefix1" is the prefix of what is being mapped from
3+
# "prefix2" is the prefix of what is being mapped to
4+
{
5+
# Remove the CR character in case the sources are mapped from
6+
# a Windows share and contain CRLF line endings
7+
gsub(/\r/,"", $0);
8+
9+
# Skip empty lines and comment lines starting with semicolon
10+
if (NF && !match($0, /^[:space:]*;/))
11+
{
12+
# Only process the entries that begin with "#"
13+
if (match($0, /^#.*/))
14+
{
15+
gsub(/^#/,"", $0);
16+
print "LEAF_ENTRY " prefix1 $0 ", _TEXT"
17+
print " " jump " EXTERNAL_C_FUNC(" prefix2 $0 ")"
18+
print "LEAF_END " prefix1 $0 ", _TEXT"
19+
print ""
20+
}
21+
}
22+
}

generateversionscript.awk

+19-10
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
BEGIN {
2-
print "V1.0 {";
3-
print " global:";
2+
print "V1.0 {";
3+
print " global:";
44
}
55
{
6-
# Remove the CR character in case the sources are mapped from
7-
# a Windows share and contain CRLF line endings
8-
gsub(/\r/,"", $0);
6+
# Remove the CR character in case the sources are mapped from
7+
# a Windows share and contain CRLF line endings
8+
gsub(/\r/,"", $0);
99

10-
# Skip empty lines and comment lines starting with semicolon
11-
if (NF && !match($0, /^[ \t]*;/))
10+
# Skip empty lines and comment lines starting with semicolon
11+
if (NF && !match($0, /^[ \t]*;/))
12+
{
13+
# Only prefix the entries that start with "#"
14+
if (match($0, /^#.*/))
1215
{
13-
print " " $0 ";";
16+
gsub(/^#/,"", $0);
17+
print " "prefix $0 ";";
1418
}
19+
else
20+
{
21+
print " "$0 ";";
22+
}
23+
}
1524
}
1625
END {
17-
print " local: *;"
18-
print "};";
26+
print " local: *;"
27+
print "};";
1928
}

src/ToolBox/SOS/Strike/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ elseif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
3838
add_definitions(-DDBG_TARGET_64BIT)
3939
add_definitions(-DDBG_TARGET_WIN64=1)
4040
endif()
41+
4142
add_definitions(-DSTRIKE)
4243

4344
remove_definitions(-DUNICODE)
@@ -183,6 +184,11 @@ endif()
183184

184185
list(APPEND SOS_SOURCES ${SOS_SOURCES_ARCH})
185186

187+
# Add the DAC PAL export mapping file
188+
if(CLR_CMAKE_PLATFORM_LINUX)
189+
list(APPEND SOS_SOURCES ${PAL_REDEFINES_FILE})
190+
endif(CLR_CMAKE_PLATFORM_LINUX)
191+
186192
if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD OR CLR_CMAKE_PLATFORM_NETBSD)
187193
# Add linker exports file option
188194
set(EXPORTS_LINKER_OPTION -Wl,--version-script=${EXPORTS_FILE})
@@ -195,6 +201,10 @@ endif(CLR_CMAKE_PLATFORM_DARWIN)
195201

196202
add_library_clr(sos SHARED ${SOS_SOURCES})
197203

204+
if(CLR_CMAKE_PLATFORM_LINUX)
205+
add_dependencies(sos pal_redefines_file)
206+
endif(CLR_CMAKE_PLATFORM_LINUX)
207+
198208
if(CLR_CMAKE_PLATFORM_UNIX)
199209
add_custom_target(sos_exports DEPENDS ${EXPORTS_FILE})
200210
add_dependencies(sos sos_exports)

src/ToolBox/SOS/lldbplugin/CMakeLists.txt

+54-39
Original file line numberDiff line numberDiff line change
@@ -45,57 +45,72 @@ elseif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
4545
SET(REQUIRE_LLDBPLUGIN false)
4646
endif()
4747

48-
set(LLVM_HOST_DIR "$ENV{LLVM_HOME}")
49-
set(WITH_LLDB_LIBS "${LLVM_HOST_DIR}/lib" CACHE PATH "Path to LLDB libraries")
50-
set(WITH_LLDB_INCLUDES "${LLVM_HOST_DIR}/include" CACHE PATH "Path to LLDB headers")
48+
if(NOT $ENV{LLVM_HOME} STREQUAL "")
49+
set(LLDB_INCLUDE_DIR "$ENV{LLVM_HOME}/include")
50+
set(LLDB_LIB_DIR "$ENV{LLVM_HOME}/lib")
51+
else()
52+
if(NOT $ENV{LLDB_INCLUDE_DIR} STREQUAL "")
53+
set(LLDB_INCLUDE_DIR "$ENV{LLDB_INCLUDE_DIR}")
54+
endif()
55+
if(NOT $ENV{LLDB_LIB_DIR} STREQUAL "")
56+
set(LLDB_LIB_DIR "$ENV{LLDB_LIB_DIR}")
57+
endif()
58+
endif()
5159

5260
if(NOT ENABLE_LLDBPLUGIN)
5361
return()
5462
endif()
5563

56-
if (CLR_CMAKE_PLATFORM_DARWIN)
64+
if(NOT $ENV{LLDB_LIB} STREQUAL "")
65+
set(LLDB_LIB "$ENV{LLDB_LIB}")
66+
else()
5767
# Check for LLDB library
58-
find_library(LLDB NAMES LLDB lldb lldb-6.0 lldb-5.0 lldb-4.0 lldb-3.9 lldb-3.8 lldb-3.7 lldb-3.6 lldb-3.5 PATHS "${WITH_LLDB_LIBS}" PATH_SUFFIXES llvm NO_DEFAULT_PATH)
59-
find_library(LLDB NAMES LLDB lldb lldb-6.0 lldb-5.0 lldb-4.0 lldb-3.9 lldb-3.8 lldb-3.7 lldb-3.6 lldb-3.5 PATH_SUFFIXES llvm)
60-
if(LLDB STREQUAL LLDB-NOTFOUND)
68+
if(CLR_CMAKE_PLATFORM_DARWIN)
69+
find_library(LLDB_LIB NAMES LLDB lldb lldb-6.0 lldb-5.0 lldb-4.0 lldb-3.9 lldb-3.8 lldb-3.7 lldb-3.6 lldb-3.5 PATHS "${WITH_LLDB_LIBS}" PATH_SUFFIXES llvm NO_DEFAULT_PATH)
70+
find_library(LLDB_LIB NAMES LLDB lldb lldb-6.0 lldb-5.0 lldb-4.0 lldb-3.9 lldb-3.8 lldb-3.7 lldb-3.6 lldb-3.5 PATH_SUFFIXES llvm)
71+
if(LLDB_LIB STREQUAL LLDB_LIB-NOTFOUND)
72+
if(REQUIRE_LLDBPLUGIN)
73+
set(MESSAGE_MODE FATAL_ERROR)
74+
else()
75+
set(MESSAGE_MODE WARNING)
76+
endif()
77+
message(${MESSAGE_MODE} "Cannot find lldb library. Try installing Xcode. You may need to set LLVM_HOME, LLDB_LIB_DIR or LLDB_LIB if the build still can't find it.")
78+
return()
79+
endif()
80+
endif()
81+
endif()
82+
83+
message(STATUS "LLDB_LIB: ${LLDB_LIB}")
84+
85+
if(NOT $ENV{LLDB_H} STREQUAL "")
86+
set(LLDB_H "$ENV{LLDB_H}")
87+
else()
88+
# Check for LLDB headers
89+
# Multiple versions of LLDB can install side-by-side, so we need to check for lldb in various locations.
90+
# If the file in a directory is found the result is stored in the variable and the search will not be repeated unless the variable is cleared.
91+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "${WITH_LLDB_INCLUDES}" NO_DEFAULT_PATH)
92+
find_path(LLDB_H "lldb/API/LLDB.h")
93+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-6.0/include")
94+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-5.0/include")
95+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-4.0/include")
96+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.9/include")
97+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.8/include")
98+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.7/include")
99+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.6/include")
100+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.5/include")
101+
#FreeBSD
102+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/local/llvm39/include")
103+
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/local/llvm38/include")
104+
105+
if(LLDB_H STREQUAL LLDB_H-NOTFOUND)
61106
if(REQUIRE_LLDBPLUGIN)
62107
set(MESSAGE_MODE FATAL_ERROR)
63108
else()
64109
set(MESSAGE_MODE WARNING)
65110
endif()
66-
message(${MESSAGE_MODE} "Cannot find lldb-3.5, lldb-3.6, lldb-3.8, lldb-3.9, lldb-4.0, lldb-5.0 or lldb-6.0. Try installing liblldb-3.9-dev (or the appropriate package for your platform). You may need to set LLVM_HOME if the build still can't find it.")
67-
111+
message(${MESSAGE_MODE} "Cannot find LLDB.h Try installing lldb-3.9-dev (or the appropriate package for your platform). You may need to set LLVM_HOME or LLDB_INCLUDE_DIR if the build still can't find it.")
68112
return()
69113
endif()
70-
71-
message(STATUS "LLDB: ${LLDB}")
72-
endif()
73-
74-
# Check for LLDB headers
75-
# Multiple versions of LLDB can install side-by-side, so we need to check for lldb in various locations.
76-
# If the file in a directory is found the result is stored in the variable and the search will not be repeated unless the variable is cleared.
77-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "${WITH_LLDB_INCLUDES}" NO_DEFAULT_PATH)
78-
find_path(LLDB_H "lldb/API/LLDB.h")
79-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-6.0/include")
80-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-5.0/include")
81-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-4.0/include")
82-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.9/include")
83-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.8/include")
84-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.7/include")
85-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.6/include")
86-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/lib/llvm-3.5/include")
87-
#FreeBSD
88-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/local/llvm39/include")
89-
find_path(LLDB_H "lldb/API/LLDB.h" PATHS "/usr/local/llvm38/include")
90-
91-
if(LLDB_H STREQUAL LLDB_H-NOTFOUND)
92-
if(REQUIRE_LLDBPLUGIN)
93-
set(MESSAGE_MODE FATAL_ERROR)
94-
else()
95-
set(MESSAGE_MODE WARNING)
96-
endif()
97-
message(${MESSAGE_MODE} "Cannot find LLDB.h Try installing lldb-3.9-dev (or the appropriate package for your platform). You may need to set LLVM_HOME if the build still can't find it.")
98-
return()
99114
endif()
100115

101116
message(STATUS "LLDB_H: ${LLDB_H}")
@@ -121,7 +136,7 @@ _add_library(sosplugin SHARED ${SOURCES})
121136
add_dependencies(sosplugin sos)
122137

123138
if (CLR_CMAKE_PLATFORM_DARWIN)
124-
target_link_libraries(sosplugin ${LLDB})
139+
target_link_libraries(sosplugin ${LLDB_LIB})
125140
endif()
126141

127142
# add the install targets

src/debug/createdump/CMakeLists.txt

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ include_directories(BEFORE ${VM_DIR})
2020

2121
add_definitions(-DPAL_STDCPP_COMPAT=1)
2222

23-
add_compile_options(-fPIC)
23+
add_compile_options(-fPIE)
2424

2525
set(CREATEDUMP_SOURCES
2626
createdump.cpp
@@ -36,11 +36,14 @@ _add_library(createdump_lib
3636

3737
_add_executable(createdump
3838
main.cpp
39+
${PAL_REDEFINES_FILE}
3940
)
4041

42+
add_dependencies(createdump pal_redefines_file)
43+
4144
target_link_libraries(createdump
4245
createdump_lib
43-
# share the PAL in the dac module
46+
# share the PAL/corguids in the dac module
4447
mscordaccore
4548
)
4649

src/dlls/mscordac/CMakeLists.txt

+50-5
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ if(WIN32)
2020

2121
set(CURRENT_BINARY_DIR_FOR_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
2222

23-
#Preprocess exports definition file
23+
# Preprocess exports definition file
2424
preprocess_def_file(${CMAKE_CURRENT_SOURCE_DIR}/${DEF_SOURCES} ${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def)
2525

26-
#create target to add file dependency on mscordac.def
26+
# Create target to add file dependency on mscordac.def
2727
add_custom_target(mscordaccore_def DEPENDS ${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def)
2828

2929
# No library groups for Win32
@@ -32,7 +32,50 @@ if(WIN32)
3232
else(WIN32)
3333
set(DEF_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/mscordac_unixexports.src)
3434
set(EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/mscordac.exports)
35-
generate_exports_file(${DEF_SOURCES} ${EXPORTS_FILE})
35+
36+
# Add dependency on export file
37+
add_custom_target(mscordaccore_exports DEPENDS ${EXPORTS_FILE})
38+
39+
if(CLR_CMAKE_PLATFORM_DARWIN)
40+
generate_exports_file(${DEF_SOURCES} ${EXPORTS_FILE})
41+
endif(CLR_CMAKE_PLATFORM_DARWIN)
42+
43+
if(CLR_CMAKE_PLATFORM_LINUX)
44+
45+
# Generate DAC export file with the DAC_ prefix
46+
generate_exports_file_prefix(${DEF_SOURCES} ${EXPORTS_FILE} DAC_)
47+
48+
set(REDEFINES_FILE_AWK_SCRIPT ${CMAKE_SOURCE_DIR}/generateredefinesfile.awk)
49+
50+
if (CLR_CMAKE_PLATFORM_ARCH_ARM OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
51+
set(JUMP_INSTRUCTION b)
52+
else()
53+
set(JUMP_INSTRUCTION jmp)
54+
endif()
55+
56+
# Generate the palredefines.inc file to map from the imported prefixed APIs (foo to DAC_foo)
57+
set(PAL_REDEFINES_INC ${GENERATED_INCLUDE_DIR}/palredefines.inc)
58+
add_custom_command(
59+
OUTPUT ${PAL_REDEFINES_INC}
60+
COMMAND ${AWK} -f ${REDEFINES_FILE_AWK_SCRIPT} -v jump=${JUMP_INSTRUCTION} -v prefix2=DAC_ ${DEF_SOURCES} > ${PAL_REDEFINES_INC}
61+
DEPENDS ${DEF_SOURCES} ${REDEFINES_FILE_AWK_SCRIPT}
62+
COMMENT "Generating PAL redefines file -> ${PAL_REDEFINES_INC}"
63+
)
64+
add_custom_target(pal_redefines_file DEPENDS ${PAL_REDEFINES_INC})
65+
66+
# Generate the libredefines.inc file for the DAC to export the prefixed APIs (DAC_foo to foo)
67+
set(LIB_REDEFINES_INC ${GENERATED_INCLUDE_DIR}/libredefines.inc)
68+
add_custom_command(
69+
OUTPUT ${LIB_REDEFINES_INC}
70+
COMMAND ${AWK} -f ${REDEFINES_FILE_AWK_SCRIPT} -v jump=${JUMP_INSTRUCTION} -v prefix1=DAC_ ${DEF_SOURCES} > ${LIB_REDEFINES_INC}
71+
DEPENDS ${DEF_SOURCES} ${REDEFINES_FILE_AWK_SCRIPT}
72+
COMMENT "Generating DAC export redefines file -> ${LIB_REDEFINES_INC}"
73+
)
74+
add_custom_target(lib_redefines_inc DEPENDS ${LIB_REDEFINES_INC})
75+
76+
# Add lib redefines file to DAC
77+
list(APPEND CLR_DAC_SOURCES libredefines.S)
78+
endif(CLR_CMAKE_PLATFORM_LINUX)
3679
endif(WIN32)
3780

3881
if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD OR CLR_CMAKE_PLATFORM_NETBSD)
@@ -64,10 +107,12 @@ _add_library(mscordacobj OBJECT mscordac.cpp)
64107

65108
add_library_clr(mscordaccore SHARED ${CLR_DAC_SOURCES} $<TARGET_OBJECTS:mscordacobj>)
66109

110+
if(CLR_CMAKE_PLATFORM_LINUX)
111+
add_dependencies(mscordaccore lib_redefines_inc)
112+
endif(CLR_CMAKE_PLATFORM_LINUX)
113+
67114
if(CLR_CMAKE_PLATFORM_UNIX)
68-
add_custom_target(mscordaccore_exports DEPENDS ${EXPORTS_FILE})
69115
add_dependencies(mscordaccore mscordaccore_exports)
70-
71116
set_property(TARGET mscordaccore APPEND_STRING PROPERTY LINK_FLAGS ${EXPORTS_LINKER_OPTION})
72117
set_property(TARGET mscordaccore APPEND_STRING PROPERTY LINK_DEPENDS ${EXPORTS_FILE})
73118
endif(CLR_CMAKE_PLATFORM_UNIX)

src/dlls/mscordac/libredefines.S

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#if defined(_X86_) || defined(_AMD64_)
2+
.intel_syntax noprefix
3+
#endif
4+
5+
#include "unixasmmacros.inc"
6+
7+
#if defined(_ARM_)
8+
.syntax unified
9+
.thumb
10+
#endif
11+
12+
#include "libredefines.inc"

0 commit comments

Comments
 (0)