2012-12-08 27 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"