WIN: Use COFF file header header for architecture detection (#14083)
Read the machine field from the COFF file header to get the exact target architecture for ARM and SHx on the Windows platform.
This commit is contained in:
parent
1768014dfc
commit
bd827f98ef
|
@ -341,6 +341,35 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
# Detect the exact architecture from the PE header.
|
||||||
|
if(WIN32)
|
||||||
|
# The offset to the PE signature is stored at 0x3c.
|
||||||
|
file(READ ${file} peoffsethex LIMIT 1 OFFSET 60 HEX)
|
||||||
|
string(SUBSTRING "${peoffsethex}" 0 1 peoffsethex1)
|
||||||
|
string(SUBSTRING "${peoffsethex}" 1 1 peoffsethex2)
|
||||||
|
set(peoffsetexpression "${peoffsethex1} * 16 + ${peoffsethex2}")
|
||||||
|
string(REPLACE "a" "10" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
string(REPLACE "b" "11" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
string(REPLACE "c" "12" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
string(REPLACE "d" "13" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
string(REPLACE "e" "14" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
string(REPLACE "f" "15" peoffsetexpression "${peoffsetexpression}")
|
||||||
|
math(EXPR peoffset "${peoffsetexpression}")
|
||||||
|
|
||||||
|
file(READ ${file} peheader LIMIT 6 OFFSET ${peoffset} HEX)
|
||||||
|
if(peheader STREQUAL "50450000a201")
|
||||||
|
set(ARCHITECTURE_ID "SH3")
|
||||||
|
elseif(peheader STREQUAL "50450000a301")
|
||||||
|
set(ARCHITECTURE_ID "SH3DSP")
|
||||||
|
elseif(peheader STREQUAL "50450000a601")
|
||||||
|
set(ARCHITECTURE_ID "SH4")
|
||||||
|
elseif(peheader STREQUAL "50450000a801")
|
||||||
|
set(ARCHITECTURE_ID "SH5")
|
||||||
|
elseif(peheader STREQUAL "50450000c201")
|
||||||
|
set(ARCHITECTURE_ID "THUMB")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# Check if a valid compiler and platform were found.
|
# Check if a valid compiler and platform were found.
|
||||||
if(COMPILER_ID AND NOT COMPILER_ID_TWICE)
|
if(COMPILER_ID AND NOT COMPILER_ID_TWICE)
|
||||||
set(CMAKE_${lang}_COMPILER_ID "${COMPILER_ID}")
|
set(CMAKE_${lang}_COMPILER_ID "${COMPILER_ID}")
|
||||||
|
|
|
@ -171,13 +171,6 @@ set(_MACHINE_ARCH_FLAG ${MSVC_C_ARCHITECTURE_ID})
|
||||||
if(NOT _MACHINE_ARCH_FLAG)
|
if(NOT _MACHINE_ARCH_FLAG)
|
||||||
set(_MACHINE_ARCH_FLAG ${MSVC_CXX_ARCHITECTURE_ID})
|
set(_MACHINE_ARCH_FLAG ${MSVC_CXX_ARCHITECTURE_ID})
|
||||||
endif()
|
endif()
|
||||||
if(WINCE)
|
|
||||||
if(_MACHINE_ARCH_FLAG MATCHES "ARM")
|
|
||||||
set(_MACHINE_ARCH_FLAG "THUMB")
|
|
||||||
elseif(_MACHINE_ARCH_FLAG MATCHES "SH")
|
|
||||||
set(_MACHINE_ARCH_FLAG "SH4")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT
|
set (CMAKE_EXE_LINKER_FLAGS_INIT
|
||||||
"${CMAKE_EXE_LINKER_FLAGS_INIT} /machine:${_MACHINE_ARCH_FLAG}")
|
"${CMAKE_EXE_LINKER_FLAGS_INIT} /machine:${_MACHINE_ARCH_FLAG}")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue