Kernel

使用帶括號的 vermagic 核心字元串執行 make 會導致 /bin/sh 語法錯誤

  • November 13, 2021

我在 Ubuntu Server 12.04 x86_64 上,我需要建構 Android CyanogenMod 7.2 核心模組。我的手機有自定義 ROM 和更新檔核心:

adb shell cat /proc/version

產量

Linux version 2.6.37.3-cyanogenmod-gf3345ef-dirty (subbotin@avs234) (gcc version 4.4.0 (GCC) ) #2 PREEMPT Sun Mar 13 14:55:50 MSK 2011

除了工具鏈變數等之外,我還有這個變數設置。

export LOCALVERSION="-cyanogenmod-gf3345ef-dirty (subbotin@avs234)"

當我執行時make注意在 Ubuntu 上bashdash),我得到以下資訊:

CHK    include/linux/version.h
/bin/sh: 1: Syntax error: "(" unexpected (expecting ")")
make: ***[include/generated/utsrelease.h] Error 2

但是,如果我刪除“(subbotin@avs234)”核心編譯就好了。我需要一個完整的 vermagic 字元串,因為我懷疑這個核心模組由於版本字元串的不同而不會載入。括號有什麼問題?

更詳細的描述:設備是 HTC Desire (bravo) GSM,應用程序是 EDS Lite ( http://play.google.com/store/apps/details?id=com.sovworks.edslite )。我部分遵循了這個http://oldwiki.cyanogenmod.org/wiki/Building_Kernel_from_source>,這是一個核心模組編譯指南<http://www.sovworks.com/details.html#compileModule。在後一個連結中,提到 vermagic 字元串可能應該完全匹配。當我嘗試從應用程序安裝菜單載入此模組時,我得到“載入核心模組失敗”

   #get repo tool
   mkdir -p ~/bin 
   curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo &gt; ~/bin/repo 
   chmod a+x ~/bin/repo 
   
   #clone repo for cm-kernel
   mkdir -p ~/Android/kernel 
   cd ~/Android/kernel 
   git clone git://github.com/CyanogenMod/cm-kernel.git 
   cd cm-kernel
   
   #pull the kernel configuration from the device
   #my config file is here: http://pastebin.com/aHA2mETG
   adb pull /proc/config.gz ~/Android/kernel/cm-kernel
   cd ~/Android/kernel/cm-kernel
   gunzip config.gz
   #replace CONFIG_LOCALVERSION and CONFIG_LOCALVERSION_AUTO with null string
   sed 's/CONFIG_LOCALVERSION\([[:alnum:][:punct:]]\)*//' config &gt; .config
   cp config .config
   
   #toolchain from http://developer.android.com/sdk/index.html#download (sdk tools)
   
   export CROSS_COMPILE=~/Android/Toolchain/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
   export CCOMPILER=~/Android/Toolchain/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
   export ARCH=arm
   export SUBARCH=arm
   export LOCALVERSION="-cyanogenmod-gf3345ef-dirty (subbotin@avs234)"
   make oldconfig

   #Answer "no" CONFIG_LOCALVERSION_AUTO (the second prompt) request.
   make
   
   #download EDS kernel module src http://www.sovworks.com/downloads.html
   #extract to ~/Android/km
   cd ~/km
   make -C ~/Android/kernel/cm-kernel\
    ARCH=arm CROSS_COMPILE=~/Android/Toolchain/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\
    EXTRA_CFLAGS=-fno-pic\
    SUBDIRS=~/Android/km modules

   #if LOCALVERSION="-cyanogenmod-gf3345ef-dirty" then vermagic string is as in the following
   modinfo eds.ko
   #...
   vermagic:       2.6.37.6-cyanogenmod-gf3345ef-dirty preempt mod_unload ARMv7 

upd:剛剛注意到目前安裝的核心的穩定版本(3)不等於建構的核心穩定版本(6)。不確定它們是否兼容——也許問題出在安裝的核心版本字元串上?

但是,如果我刪除“(subbotin@avs234)”核心編譯就好了。

您在 LOCALVERSION 中不需要這個。“subbotin@avs234”只是編譯核心(user@host)的那個。它不是版本字元串的一部分,也不是與核心編譯相關的任何內容。

引用自:https://unix.stackexchange.com/questions/83705