apollo
apollo copied to clipboard
Optimize bug on aarch64
Describe the bug
platform:aarch64, gcc8.2,
build option: release or -O1
CRoutine::GetCurrentRoutine()
return nullptr after current_routine_ = this;
build option: debug
It's OK
To Reproduce
- write 2 node(pub, sub)
- build with release, and run
- reason: May be some optimize option make GetCurrentRoutine get the old value.
- solve: build with debug option or fix the code
static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
RoutineState Resume()__attribute__((optimize("-O0")));
追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加
追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加
加过了,我是移植到Xilinx Zynq平台,CMake构建
cmake_minimum_required(VERSION 3.0)
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
You should create a separate directory for build files.
")
endif()
project(cyber_core LANGUAGES C CXX)
ENABLE_LANGUAGE(ASM)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}")
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../
${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include
${CMAKE_SYSROOT}/usr/include)
set(target_supports_shared_libs true)
file(GLOB_RECURSE DIR_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S
#${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S
${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/state.cc
${CMAKE_CURRENT_SOURCE_DIR}/binary.cc
${CMAKE_CURRENT_SOURCE_DIR}/init.cc
${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc
${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc
)
add_library(${PROJECT_NAME} SHARED ${DIR_SRCS})
install(TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION lib # 动态库安装路径
ARCHIVE DESTINATION lib # 静态库安装路径
RUNTIME DESTINATION bin # 可执行文件安装路径
)
追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加
加过了,我是移植到Xilinx Zynq平台,CMake构建
cmake_minimum_required(VERSION 3.0) if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}") message(FATAL_ERROR " FATAL: In-source builds are not allowed. You should create a separate directory for build files. ") endif() project(cyber_core LANGUAGES C CXX) ENABLE_LANGUAGE(ASM) set(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 99) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_BUILD_TYPE Release) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}") include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_SOURCE_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include ${CMAKE_SYSROOT}/usr/include) set(target_supports_shared_libs true) file(GLOB_RECURSE DIR_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S #${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/state.cc ${CMAKE_CURRENT_SOURCE_DIR}/binary.cc ${CMAKE_CURRENT_SOURCE_DIR}/init.cc ${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc ${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc ) add_library(${PROJECT_NAME} SHARED ${DIR_SRCS}) install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib # 动态库安装路径 ARCHIVE DESTINATION lib # 静态库安装路径 RUNTIME DESTINATION bin # 可执行文件安装路径 )
我自己的是Xavier上 是可以的
@
追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加
加过了,我是移植到Xilinx Zynq平台,CMake构建
cmake_minimum_required(VERSION 3.0) if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}") message(FATAL_ERROR " FATAL: In-source builds are not allowed. You should create a separate directory for build files. ") endif() project(cyber_core LANGUAGES C CXX) ENABLE_LANGUAGE(ASM) set(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 99) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_BUILD_TYPE Release) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}") include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_SOURCE_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include ${CMAKE_SYSROOT}/usr/include) set(target_supports_shared_libs true) file(GLOB_RECURSE DIR_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S #${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/state.cc ${CMAKE_CURRENT_SOURCE_DIR}/binary.cc ${CMAKE_CURRENT_SOURCE_DIR}/init.cc ${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc ${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc ) add_library(${PROJECT_NAME} SHARED ${DIR_SRCS}) install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib # 动态库安装路径 ARCHIVE DESTINATION lib # 静态库安装路径 RUNTIME DESTINATION bin # 可执行文件安装路径 )
查查你的protobuf 有没有PIC
arm64版本的gcc 默认是不带PIC的,所以需要check你的每一个thirdpart包 都要确保PIC 才能解决你的问题
apollo arm版本的docker也有这个问题, @storypku
@leeyuanalibaba 你说的docker也有这个问题,请问是具体修改哪个位置?
编译选项里加 -fPIC
shadowMan @.***
Original
From:"Zhang Xu-Hui"< @.*** >;
Date:2023/7/4 11:08
To:"ApolloAuto/apollo"< @.*** >;
CC:"leeyuanalibaba"< @.*** >;"Mention"< @.*** >;
Subject:Re: [ApolloAuto/apollo] Optimize bug on aarch64 (#13351)
@leeyuanalibaba 你说的docker也有这个问题,请问是具体修改哪个位置?
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>
Describe the bug platform:aarch64, gcc8.2, build option: release or -O1
CRoutine::GetCurrentRoutine()
return nullptr aftercurrent_routine_ = this;
build option: debug It's OKTo Reproduce
- write 2 node(pub, sub)
- build with release, and run
- reason: May be some optimize option make GetCurrentRoutine get the old value.
- solve: build with debug option or fix the code
static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
RoutineState Resume()__attribute__((optimize("-O0")));
inline CRoutine* CRoutine::GetCurrentRoutine() { #if defined aarch64 _sync_synchronize(); #endif return current_routine; } can sovle this problem
static CRoutine GetCurrentRoutine()attribute((optimize("-O0"))); RoutineState Resume()attribute((optimize("-O0"))); inline CRoutine CRoutine::GetCurrentRoutine() { #if defined aarch64 _sync_synchronize(); #endif return current_routine; }
确定修改这部分就能解决问题吗,我这边按照这个修改依然还是有问题