簡體   English   中英

如何交叉編譯 Android 的內核/執行工具?

[英]How to cross compile kernel/exec-tools for android?

我正在嘗試為 android 構建kexec ,所以我從這里克隆並做了

autoreconf && LDFLAGS=-static ./configure --host=aarch64-linux-android && make 

但最后我得到

purgatory/arch/arm64/entry.S: Assembler messages:
purgatory/arch/arm64/entry.S:14: Error: no such instruction: `adr x19,.Lstack'
purgatory/arch/arm64/entry.S:15: Error: too many memory references for `mov'
purgatory/arch/arm64/entry.S:17: Error: no such instruction: `bl purgatory'
purgatory/arch/arm64/entry.S:20: Error: no such instruction: `ldr x17,arm64_kernel_entry'
purgatory/arch/arm64/entry.S:21: Error: no such instruction: `ldr x0,arm64_dtb_addr'
purgatory/arch/arm64/entry.S:22: Error: too many memory references for `mov'
purgatory/arch/arm64/entry.S:23: Error: too many memory references for `mov'
purgatory/arch/arm64/entry.S:24: Error: too many memory references for `mov'
purgatory/arch/arm64/entry.S:25: Error: no such instruction: `br x17'
purgatory/arch/arm64/entry.S:29: Error: unknown pseudo-op: `.ltorg'
purgatory/arch/arm64/entry.S:39: Error: alignment not a power of 2
set -ex
export TOOLCHAIN=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
#minSdkVersion.
export API=28
export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
(cd kex && autoreconf && LDFLAGS=-static ./configure --host $TARGET && make)
# needed because of https://github.com/termux/termux-packages/issues/8273
./align_fix.py kex/build/sbin/kexec

其中align_fix.py:

#!/usr/bin/env python

import struct
import sys
import os

if len(sys.argv) < 2:
    print('Usage: ' + os.path.basename(sys.argv[0]) + ' input_file')
    exit()

with open(sys.argv[1], 'r+b') as f:
  f.seek(0)
  hdr = f.read(16)
  if hdr[0] != 0x7f or hdr[1] != ord('E') or hdr[2] != ord('L') or hdr[3] != ord('F'):
    raise Exception('Not an elf file')

  if hdr[4] == 1:
    # 32 bit code
    f.seek(28)
    offset = struct.unpack('<I', f.read(4))[0]
    f.seek(42)
    phsize = struct.unpack('<H', f.read(2))[0]
    phnum = struct.unpack('<H', f.read(2))[0]
    for i in range(0, phnum):
      f.seek(offset + i * phsize)
      t = struct.unpack('<I', f.read(4))[0]
      if t == 7:
        f.seek(28 - 4, 1)
        align = struct.unpack('<I', f.read(4))[0]
        print('Found TLS segment with align = ' + str(align))
        if (align < 32):
          print('TLS segment is underaligned, patching')
          f.seek(-4, 1)
          f.write(struct.pack('<I', 32))

  elif hdr[4] == 2:
    # 64 bit code
    f.seek(32)
    offset = struct.unpack('<Q', f.read(8))[0]
    f.seek(54)
    phsize = struct.unpack('<H', f.read(2))[0]
    phnum = struct.unpack('<H', f.read(2))[0]
    for i in range(0, phnum):
      f.seek(offset + i * phsize)
      t = struct.unpack('<I', f.read(4))[0]
      if t == 7:
        f.seek(48 - 4, 1)
        align = struct.unpack('<Q', f.read(8))[0]
        print('Found TLS segment with align = ' + str(align))
        if (align < 64):
          print('TLS segment is underaligned, patching')
          f.seek(-8, 1)
          f.write(struct.pack('<H', 64))

  else:
    raise Exception('Unknown file class')

來自https://github.com/Lzhiyong/termux-ndk/blob/master/patches/align_fix.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM