2012-12-08 26 views
2

可用於http://lttng.org/download的源代碼tarball中的自述文件似乎假設人們構建在將成爲跟蹤目標的相同Linux系統上。我發現其他資源解釋瞭如何做到這一點(LTTng Project YouTube channel有非常好的屏幕錄像),但我找不到任何有關如何交叉編譯LTTng(特別是,我猜,liburcu,LTTng-UST,LTTng-工具和LTTng模塊),並將其全部安裝在嵌入式Linux系統上(我可以在其中構建或重建內核,使用設備樹blob和現在 - 基於ramdisk的文件系統)。如何構建LTTng並將其部署到嵌入式Linux系統?

我在哪裏可以找到有關如何操作的詳細信息?

更新:作爲Marko指出了下面的第一個評論,在LTTng工具使用autoconf建造。理論上我理解我可以找出configure的「--host」選項,類似於this answer。也許我需要一個像「ARCH = arm」這樣的參數到make,就像我在構建內核時使用的一樣。但是,當在同一臺機器上構建LTTng組件時使用的make install等效交叉編譯是什麼?

+1

我最後一次建LTT用戶空間工具,這不是一個特別簡單的練習 - 但它們是爲'autoconf'設置的 - 所以這個過程非常類似於使用交叉編譯器構建任何其他軟件。 如果您正在使用一個設置良好的跨環境,其中已經使用目標庫和標頭路徑設置了'gcc',這只是在調用'autoconf'時指定了sysroot和可能的編譯器名稱。如果不是,則需要另外設置負載。 你有沒有LTT'd內核?這可能是一個更大的挑戰。 – marko

+0

謝謝@Marko。我會通過更新我的問題來回應你的'autoconf'評論... –

+0

...我認爲LTTng 2.0的一個特性是它不再需要補丁。來自http://lwn.net/Articles/491510/:「與其前身LTTng 0.x不同,它可以安裝在不含任何補丁的vanilla或發行版內核上。」如果內核需要專門配置LTTng 2.0,我找不到任何細節。 –

回答

5

LTTng 2.x不再需要修補內核。您需要加載內核模塊(lttng-modules)以執行內核跟蹤。所支持的最低Linux內核版本是2.6.38。 您可以低至2.6.32,但您需要根據LTTng 2.1 release notelttng-modules README將3個補丁應用於您的內核。

要回復交叉編譯的問題,在這裏我用通常的程序交叉編譯LTTng工具鏈(用於用戶空間跟蹤):

export HOST=<your host triplet (e.g. arm-linux-gnueabi)> 

# Make sure your cross-compiler can be found in your $PATH 
export SYSROOT=<path to the target sysroot> 

export CFLAGS="--sysroot=$SYSROOT" 
export CPPFLAGS="-I$SYSROOT/include" 
export CXXFLAGS=$CFLAGS 
export LDFLAGS="--sysroot=$SYSROOT -L$SYSROOT/usr/lib -L$SYSROOT/lib" 

# Fix RPL_MALLOC issue. See [Autoconf and RPL_MALLOC][3] for more details. 
export ac_cv_func_malloc_0_nonnull=yes 

# Cross compile userspace-rcu. You can also use a source tarball. 
git clone git://git.lttng.org/userspace-rcu.git 
cd userspace-rcu 
./bootstrap 
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT 
make 
make install 

# Cross compile lttng-ust. You can also use a source tarball. 
git clone git://git.lttng.org/lttng-ust.git 
cd lttng-ust 
./bootstrap 
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT 
make 
make install 

# Cross compile lttng-tools. You can also use a source tarball. 
git clone git://git.lttng.org/lttng-tools.git 
cd lttng-tools 
./bootstrap 
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT 
make 
make install 

你應該能夠將此適應你平臺。如果你想做內核跟蹤,你也需要以類似的方式交叉編譯lttng-modules。

2

更新:ARM的LTTng交叉編譯現在更簡單。

首先,安裝所需的依賴關係。例如,與Emdebian工具鏈:

xapt -a armel -m libc6-dev libpopt-dev uuid-dev liburcu-dev 

然後:

export HOST=arm-linux-gnueabi 
export SYSROOT=<path to the target sysroot> 

git clone git://git.lttng.org/lttng-ust.git 
cd lttng-ust 
./bootstrap 
./configure --host=$HOST --prefix=$SYSROOT/usr/local 
make -j8 
make install 

git clone git://git.lttng.org/lttng-tools.git 
cd lttng-tools 
./bootstrap 
./configure --host=$HOST --prefix=$SYSROOT/usr/local 
make -j8 
make install 

備註:有時會失敗,因爲 '測試' 子目錄中的二進制文件。在這種情況下,只需從Makefile中刪除'tests'(在執行./configure之後)即可。

0

我只是想分享我使用的構建腳本。它還編譯了一些其他缺失的依賴關係。 HTH

它編譯如下:

libuuid - libxml2的 - POPT - libiconv的 - zlib的 - 用戶空間RCU - lttng - 烏斯季 - lttng工具 - lttng模塊

#!/bin/bash 

# install this stuff before 
# apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 bison flex build-essential 
# change your flags here 

export PATH=/home/build/sam9/compiler/arm-2014.05/bin:$PATH 
export ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes 
export HOST=arm-none-linux-gnueabi 
export SYSROOT=/home/build/sam9/sysroot 

G_CC=arm-none-linux-gnueabi-gcc 
G_PREFIX=/usr/local 

G_ARCH=arm 
G_CROSS_COMPILE=arm-none-linux-gnueabi- 
G_KERNELDIR=/home/build/sam9/linux-3.4.106 


G_CFG_FILE="$PWD/${0%\.*}.conf" # tracking download/compile steps 

G_TARBALL_DIR=$PWD/tarballs 
G_SOURCES_DIR=$PWD/sources 
G_BUILD_DIR=$PWD/builds 

# steps for tracking progress in $G_CFG_FILE 
step_start=0 
step_download=1 
step_compile=2 

echo 
echo "This script will compile and install lttng and some deps" 
echo "Building for HOST=$HOST" 
echo 
echo "Builds are located in $G_BUILD_DIR" 
echo "Sources are located in $G_SOURCES_DIR" 
echo "Tarballs are located in $G_TARBALL_DIR" 
echo "sysroot is located at $SYSROOT" 
echo "prefix is set to $G_PREFIX" 
echo 
echo "press Enter to continue or CRTL-C to abort" 
read 

[ -e "$G_CFG_FILE" ] && . "$G_CFG_FILE" &> /dev/null 

function get_src_dir() 
{ 
    local filename="$1" 
    tar -tf "$G_TARBALL_DIR/$filename"| sed -e '[email protected]/.*@@' | uniq 
} 

function build() 
{ 
    local filename="$1" 
    local what="$2" 
    local dir_name="$3" 
    local state="$4" 
    local do_bootstrap=$5 

    if [ $state -eq $step_download ] ; then 

     if $do_bootstrap ; then 
      pushd $G_SOURCES_DIR/$dir_name 
      ./bootstrap 
      popd 
     fi 

     mkdir -p "$G_BUILD_DIR/$dir_name"  
     pushd "$G_BUILD_DIR/$dir_name"  
     if [ -n "$patch" ] ; then 
      pushd "$G_SOURCES_DIR/$dir_name"   
      wget $patch -O- | patch -p1 
      popd 
     fi 
     "$G_SOURCES_DIR/$dir_name"/configure --host=$HOST --prefix=$SYSROOT/${G_PREFIX} $EXTRA_CONF 
     make -j3 
     make install && echo "$what=$step_compile" >> $G_CFG_FILE 
     popd 
    fi 
    if [ $state -eq $step_compile ] ; then 
     echo ">> $what is already compiled" 
    fi 
} 

function download() 
{ 
    local url="$1" 
    local what="$2" 
    local filename="$3" 
    local state="$4" 

    if [ $state -lt $step_download ] ; then 
     wget "$url" -O "$G_TARBALL_DIR/$filename" 
     echo "$what=$step_download" >> $G_CFG_FILE 
     tar -C $G_SOURCES_DIR -xf "$G_TARBALL_DIR/$filename" 
     . "$G_CFG_FILE" &> /dev/null 
    fi 
} 

function download_git() 
{ 
    local url="$1" 
    local what="$2" 
    local filename="$3" 
    local state="$4" 

    if [ $state -lt $step_download ] ; then 

     pushd $G_SOURCES_DIR 
     git clone $url 
     popd 
     echo "$what=$step_download" >> $G_CFG_FILE 
     . "$G_CFG_FILE" &> /dev/null 
    fi 
} 

function init() 
{ 
    local what="$1" 
    eval state=\$$what 

    if [ ! -n "$state" ] ; then 
     echo "$what=$step_start" >> $G_CFG_FILE 
     . "$G_CFG_FILE" &> /dev/null 
    fi 

    eval state=\$$what 
} 

function get_em() 
{ 
    local url="$1" 
    local what="$2" 
    local filename=$(basename $url) 

    init "$what" 
    download "$url" "$what" $filename $state 
    eval state=\$$what 
    local dir_name=$(get_src_dir $filename) 
    build $filename "$what" $dir_name $state false 
} 

function get_em_git() 
{ 
    local url="$1" 
    local what="$2" 
    local do_bootstrap="$3" 
    local filename=$(basename $url) 
    filename=${filename/.git} 

    init "$what" 
    download_git "$url" "$what" $filename $state 
    eval state=\$$what 

    build $filename "$what" $filename $state $do_bootstrap 
} 

echo "create directories" 
mkdir -p "$G_TARBALL_DIR" "$G_SOURCES_DIR" "$G_BUILD_DIR" &>/dev/null 


######################## 
# define the packages we want to compile 
######################## 

# this are the dependencies that are missing for our sysroot 
# we will compile them and install the to the $SYSROOT 
# 
# --- BEGIN --- dependencies 
what=libuuid 
url=http://downloads.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz 
get_em $url "$what" 

what=libxml2 
url=ftp://gd.tuwien.ac.at/pub/libxml/libxml2-sources-2.9.2.tar.gz 
EXTRA_CONF=--without-python 
get_em $url "$what" 
unset EXTRA_CONF 

what=popt 
url=ftp://anduin.linuxfromscratch.org/BLFS/svn/p/popt-1.16.tar.gz 
get_em $url "$what" 

what=libiconv 
url=http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz 
patch=http://data.gpo.zugaina.org/gentoo/dev-libs/libiconv/files/libiconv-1.14-no-gets.patch 
get_em $url "$what" 
unset patch 

what=zlib 
url=http://zlib.net/zlib-1.2.8.tar.gz 
init "$what" 
filename=$(basename $url) 
download "$url" "$what" $filename $state 
if [ $state -eq $step_compile ] ; then 
    echo ">> $what is already compiled" 
else 
    dir_name=$(get_src_dir $filename) 
    pushd $G_SOURCES_DIR/$dir_name 
    CC=$G_CC \ 
    LDSHARED="$G_CC -shared -Wl,-soname,libz.so.1" \ 
    ./configure --shared --prefix=$SYSROOT/${G_PREFIX} 
    make 
    make install prefix=$SYSROOT/${G_PREFIX} && echo "$what=$step_compile" >> $G_CFG_FILE 
    popd 
fi 

# --- END --- dependencies 


####################### 
# compile lttng related packages and install into $SYSROOT 
what=userspace_rcu 
url=git://git.lttng.org/userspace-rcu.git 
get_em_git $url "$what" true 

what=lttng_ust 
url=git://git.lttng.org/lttng-ust.git 
export CPPFLAGS="-I$SYSROOT/${G_PREFIX}/include" 
export LDFLAGS="-L$SYSROOT/${G_PREFIX}/lib -Wl,-rpath-link=$SYSROOT/${G_PREFIX}/lib" 
get_em_git $url "$what" true 
unset CPPFLAGS 
unset LDFLAGS 

what=lttng_tools 
url=git://git.lttng.org/lttng-tools.git 
export CPPFLAGS="-I$SYSROOT/${G_PREFIX}/include" 
export LDFLAGS="-L$SYSROOT/${G_PREFIX}/lib -Wl,-rpath-link=$SYSROOT/${G_PREFIX}/lib" 
get_em_git $url "$what" true 
unset CPPFLAGS 
unset LDFLAGS 

what=lttng_modules 
url=git://git.lttng.org/lttng-modules.git 
init "$what" 
filename=$(basename $url) 
filename=${filename/.git} 
download_git "$url" "$what" $filename $state 
if [ $state -eq $step_compile ] ; then 
    echo ">> $what is already compiled" 
else 
    #dir_name=$(get_src_dir $filename) 
    pushd $G_SOURCES_DIR/$filename 
    make ARCH=$G_ARCH CROSS_COMPILE=$G_CROSS_COMPILE KERNELDIR=$G_KERNELDIR -j4 
    make ARCH=$G_ARCH CROSS_COMPILE=$G_CROSS_COMPILE KERNELDIR=$G_KERNELDIR INSTALL_MOD_PATH=$SYSROOT modules_install \ 
     && echo "$what=$step_compile" >> $G_CFG_FILE 
    popd 
fi 

echo 
echo "INFO: the build progress for all packages is tracked in $G_CFG_FILE"