파다 평범일상

LuaJIT.cmake를 빌드하다가 생긴일 "Error: unknown mnemonic" 본문

컴퓨터 IT/얕은 컴퓨터 지식과 프로그래밍

LuaJIT.cmake를 빌드하다가 생긴일 "Error: unknown mnemonic"

파다 평범일상 2024. 5. 3. 09:14
반응형

Fluent Bit를 x86_64 아키텍처에서 ARM AArch64 아키텍처로 Cross Compile 하는 과정에서 생긴일이다.

 

add_custom_command(OUTPUT ${MINILUA_PATH}
    COMMAND ${CMAKE_COMMAND} ${TEMP_TOOLCHAIN} ${TARGET_SYS} -DLUAJIT_DIR=${LUAJIT_DIR}
            -DCMAKE_SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P}
            ${CMAKE_CURRENT_LIST_DIR}/host/minilua
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/minilua 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/minilua)

 

위에 코드는 minilua 라는 바이너리를 생성하는 CMake 코드이다.

x86_64 Docker 환경에서 AArch64 Toolchain을 사용해서 빌드 했을때 산출물은 "ARM AArch64" 아키텍처 였다.

 

정상적으로 Cross Compile이 진행된것 같지만 다음이 문제였다.

# Generate buildvm_arch.h
add_custom_command(OUTPUT ${BUILDVM_ARCH_H}
  COMMAND ${HOST_WINE} ${MINILUA_PATH} ${DASM_PATH} ${DASM_FLAGS}
          -o ${BUILDVM_ARCH_H} ${VM_DASC_PATH}
  DEPENDS minilua)
add_custom_target(buildvm_arch_h ALL
  DEPENDS ${BUILDVM_ARCH_H}
)

 

방금 생성한 minilua 라는 바이너리를 실행하여 "buildvm_arch.h"를 생성하는 코드인데,

Fluent Bit를 x86_64 아키텍처에서 ARM AArch64 아키텍처로 Cross Compile 하는 과정에서 실행 할 수 없다는 에러가 발생하였다.

 

minilua는 AArch64 아키텍처로 생성되었기 때문에 현재 실행중인 x86_64 환경에서는 실행할 수 없었다.

set(MINILUA_PATH /workdir/x86_64/Debug/src/fluent-bit/build/bin/minilua)

해결할 방법이 안보여서, 임시로 x86_64용 minilua를 사용해서 생성할 수 있도록 하드코딩해서 다음으로 넘어갔다.

 

임시 방법으로 "buildvm_arch.h"를 생성시키고 이것에 의존하는 "buildvm" 바이너리를 생성했다.

이렇게 생성한 "buildvm" 산출물도 "ARM AArch64" 아키텍처 였다.

 

그 다음으로LJ_VM_S 라는 기계어를 어셈블리어로 번역한 *.s 확장장의 파일을 만들때에도  "buildvm"을 사용하기 때문에

set(BUILDVM_PATH /workdir/x86_64/Debug/src/fluent-bit/build/bin/buildvm)

위와 같은 임시로 x86_64용 buildvm을 사용할 수 있도록 하드코딩해서 다음으로 넘어갔다.

 

그렇게 잘 되나 싶더니 생전 처음보는 에러들이 발생하였다.

buildvm_x86.dasc: Assembler messages:
buildvm_x86.dasc:252: Error: unknown mnemonic `call' -- `call lj_tab_len'
buildvm_x86.dasc:417: Error: unknown mnemonic `call' -- `call pow@PLT'
buildvm_x86.dasc:428: Error: unknown mnemonic `call' -- `call lj_meta_cat'
buildvm_x86.dasc:506: Error: unknown mnemonic `call' -- `call lj_gc_barrieruv'
buildvm_x86.dasc:520: Error: unknown mnemonic `call' -- `call lj_gc_barrieruv'
buildvm_x86.dasc:550: Error: unknown mnemonic `call' -- `call lj_func_closeuv'
buildvm_x86.dasc:562: Error: unknown mnemonic `call' -- `call lj_func_newL_gc'
buildvm_x86.dasc:576: Error: unknown mnemonic `call' -- `call lj_tab_new'
buildvm_x86.dasc:581: Error: unknown mnemonic `call' -- `call lj_gc_step_fixtop'
buildvm_x86.dasc:592: Error: unknown mnemonic `call' -- `call lj_tab_dup'
buildvm_x86.dasc:596: Error: unknown mnemonic `call' -- `call lj_gc_step_fixtop'
buildvm_x86.dasc:709: Error: unknown mnemonic `call' -- `call lj_tab_newkey'
buildvm_x86.dasc:742: Error: unknown mnemonic `call' -- `call lj_tab_reasize'
buildvm_x86.dasc:857: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:1174: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:1206: Error: unknown mnemonic `jmp' -- `jmp lj_err_throw'
buildvm_x86.dasc:1247: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:1366: Error: unknown mnemonic `call' -- `call lj_meta_tget'
buildvm_x86.dasc:1386: Error: unknown mnemonic `call' -- `call lj_tab_getinth'
buildvm_x86.dasc:1416: Error: unknown mnemonic `call' -- `call lj_meta_tset'
buildvm_x86.dasc:1438: Error: unknown mnemonic `call' -- `call lj_tab_setinth'
buildvm_x86.dasc:1449: Error: unknown mnemonic `call' -- `call lj_meta_comp'
buildvm_x86.dasc:1478: Error: unknown mnemonic `call' -- `call lj_meta_equal'
buildvm_x86.dasc:1488: Error: unknown mnemonic `call' -- `call lj_meta_equal_cd'
buildvm_x86.dasc:1498: Error: unknown mnemonic `call' -- `call lj_meta_istype'
buildvm_x86.dasc:1548: Error: unknown mnemonic `call' -- `call lj_meta_arith'
buildvm_x86.dasc:1566: Error: unknown mnemonic `call' -- `call lj_meta_len'
buildvm_x86.dasc:1583: Error: unknown mnemonic `call' -- `call lj_meta_call'
buildvm_x86.dasc:1597: Error: unknown mnemonic `call' -- `call lj_meta_for'
buildvm_x86.dasc:1664: Error: unknown mnemonic `call' -- `call lj_tab_get'
buildvm_x86.dasc:1689: Error: unknown mnemonic `call' -- `call lj_strfmt_num'
buildvm_x86.dasc:1702: Error: unknown mnemonic `call' -- `call lj_tab_next'
buildvm_x86.dasc:1741: Error: unknown mnemonic `call' -- `call lj_tab_getinth'
buildvm_x86.dasc:1813: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:1839: Error: unknown mnemonic `call' -- `call lj_ffh_coroutine_wrap_err'
buildvm_x86.dasc:1841: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:1926: Error: unknown mnemonic `call' -- `call log@PLT'
buildvm_x86.dasc:1937: Error: unknown mnemonic `call' -- `call log10@PLT'
buildvm_x86.dasc:1948: Error: unknown mnemonic `call' -- `call exp@PLT'
buildvm_x86.dasc:1959: Error: unknown mnemonic `call' -- `call sin@PLT'
buildvm_x86.dasc:1970: Error: unknown mnemonic `call' -- `call cos@PLT'
buildvm_x86.dasc:1981: Error: unknown mnemonic `call' -- `call tan@PLT'
buildvm_x86.dasc:1992: Error: unknown mnemonic `call' -- `call asin@PLT'
buildvm_x86.dasc:2003: Error: unknown mnemonic `call' -- `call acos@PLT'
buildvm_x86.dasc:2014: Error: unknown mnemonic `call' -- `call atan@PLT'
buildvm_x86.dasc:2025: Error: unknown mnemonic `call' -- `call sinh@PLT'
buildvm_x86.dasc:2036: Error: unknown mnemonic `call' -- `call cosh@PLT'
buildvm_x86.dasc:2047: Error: unknown mnemonic `call' -- `call tanh@PLT'
buildvm_x86.dasc:2059: Error: unknown mnemonic `call' -- `call pow@PLT'
buildvm_x86.dasc:2071: Error: unknown mnemonic `call' -- `call atan2@PLT'
buildvm_x86.dasc:2083: Error: unknown mnemonic `call' -- `call fmod@PLT'
buildvm_x86.dasc:2105: Error: unknown mnemonic `call' -- `call frexp@PLT'
buildvm_x86.dasc:2118: Error: unknown mnemonic `call' -- `call modf@PLT'
buildvm_x86.dasc:2172: Error: unknown mnemonic `call' -- `call lj_str_new'
buildvm_x86.dasc:2217: Error: unknown mnemonic `call' -- `call lj_buf_putstr_reverse'
buildvm_x86.dasc:2219: Error: unknown mnemonic `call' -- `call lj_buf_tostr'
buildvm_x86.dasc:2233: Error: unknown mnemonic `call' -- `call lj_buf_putstr_lower'
buildvm_x86.dasc:2235: Error: unknown mnemonic `call' -- `call lj_buf_tostr'
buildvm_x86.dasc:2249: Error: unknown mnemonic `call' -- `call lj_buf_putstr_upper'
buildvm_x86.dasc:2251: Error: unknown mnemonic `call' -- `call lj_buf_tostr'
buildvm_x86.dasc:2433: Error: unknown mnemonic `call' -- `call lj_state_growstack'
buildvm_x86.dasc:2443: Error: unknown mnemonic `call' -- `call lj_gc_step'
buildvm_x86.dasc:2470: Error: unknown mnemonic `call' -- `call lj_dispatch_ins'
buildvm_x86.dasc:2490: Error: unknown mnemonic `call' -- `call lj_trace_hot'
buildvm_x86.dasc:2508: Error: unknown mnemonic `call' -- `call lj_dispatch_call'
buildvm_x86.dasc:2527: Error: unknown mnemonic `call' -- `call lj_dispatch_stitch'
buildvm_x86.dasc:2537: Error: unknown mnemonic `call' -- `call lj_dispatch_profile'
buildvm_x86.dasc:2559: Error: unknown mnemonic `call' -- `call lj_trace_exit'
buildvm_x86.dasc:2578: Error: unknown mnemonic `call' -- `call lj_err_trace'
buildvm_x86.dasc:2689: Error: unknown mnemonic `call' -- `call lj_ccallback_enter'
buildvm_x86.dasc:2702: Error: unknown mnemonic `call' -- `call lj_ccallback_leave'

 

처음보는 에러였다. mnemonic 이라는 단어도 처음보았다. 니모닉 (menmonic)은 다음과 같이 정의되고 있었다.

기계어는 실제로 컴퓨터 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합이다. 이러한 각 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리 언어이다.

 

대충 에러는 기계어를 번역하고 사용하려고 했더니 정의되어지지 않았다? 아키텍처가 안맞아서 모르겠다? 이런 내용인것 같다.

Comments