How do I build and deploy LTTng to an embedded Linux system?

The README files in the source tarballs available on http://lttng.org/download seem to assume that one is building on the same Linux system that will be the target for traces. I’ve found other resources that explain how to do this (the LTTng Project YouTube channel has very nice screencasts), but I can’t find any instructions for how to cross-compile LTTng (specifically, I guess, liburcu, LTTng-UST, LTTng-tools, and LTTng-modules), and install it all on a embedded Linux system (where I can build or rebuild the kernel, use a device tree blob and—for now—a ramdisk-based file system).

Where can I find details on how to do this?

Update: As Marko points out in the first comment below, the LTTng tools are built using autoconf. I understand in theory that I can figure out a “–host” option to configure, similar to this answer. And perhaps I need a parameter like “ARCH=arm” to make like I use when building the kernel. But what is the cross-compilation equivalent of make install that is used when building the LTTng components on the same machine where they’ll be used?


The last time I build the LTT user-space tools, it was not a particularly easy exercise - but they were set up for autoconf - so the procedure was very much like building any other software with a cross-compiler. If you’re using a nicely set-up cross environment where your gcc is already set up with the targets library and header path, this is simply a case of specifying the sysroot and possibly compiler name when invoking autoconf. If not, you’ll need to set up loads besides. Have you got an LTT’d kernel yet? This may well be a bigger challenge. –
marko
Dec 8, 2012 at 19:56
Thanks @Marko. I’ll respond to your autoconf comments by updating my question… –
Daryl Spitzer
Dec 9, 2012 at 2:42
…I think a feature of LTTng 2.0 is that it no longer requires a patch. From lwn.net/Articles/491510: “Unlike its predecessor, LTTng 0.x, it can be installed on a vanilla or distribution kernel without any patches.” If the kernel needs to be specifically configured for LTTng 2.0, I can’t find any details. –
Daryl Spitzer
Dec 9, 2012 at 2:55


回答:

LTTng 2.x no longer requires a patched kernel. You need to load a kernel module (lttng-modules) in order to do kernel tracing. The lowest Linux kernel version supported is 2.6.38. You can go as low as 2.6.32 but you will need to apply 3 patches to your kernel according to LTTng 2.1 release note and lttng-modules README.

To respond to your cross-compilation question, here is the usual procedure I use to cross-compile the LTTng toolchain (for user space tracing):

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
You should be able to adapt this to your platform. If you want to do kernel tracing, you will also need to cross-compile lttng-modules in a similar fashion.

Share
Improve this answer
Follow


Update: LTTng cross-compilation for ARM is now simpler.

First, install the required dependencies. For instance, with the Emdebian Toolchain:

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

Then:

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

Remark: sometimes make fails to because of the ‘tests’ subdirectory binaries. In this case, just delete ‘tests’ from the Makefile (right after doing ./configure).


I just want to share the build script that I used. It also compiles some other missing dependencies. HTH

It compiles the following:

libuuid - libxml2 - popt - libiconv - zlib - userspace-rcu - lttng-ust - lttng-tools - lttng-modules

#!/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 's@/.*@@' | 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"

I get the following error: Bison >= 2.4 is required when building from the Git repository. You can set the YACC variable to override automatic detection.

猜你喜欢

转载自blog.csdn.net/kuno_y/article/details/127559005