kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

编译Android的kernel

一 下载

  1. 下载arm编译器
    https://launchpad.net/gcc-arm-embedded/+download

  2. 进入到你的android源代码目录,敲入下面命令:
    git clone http://android.googlesource.com/kernel/goldfish.git kernel

  3. cd kernel 进入我们刚才创建的kernel文件夹

  4. git branch -avv 查看远程的git 库
    我们选择remotes/origin/android-goldfish-2.6.29分支来下载

  5. git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29

二 编译kernel代码

  1. 设置环境变量
    export PATH=$PATH:~/andr-perf/gcc-arm-none-eabi-4_8-2014q3/bin

  2. 修改kernel下面的makefile文件,修改
    ARCH ?= $(SUBARCH)
    CROSS_COMPILE ?=
    这两个字段成如下内容:
    ARCH ?= arm
    CROSS_COMPILE ?= arm-none-eabi-
    // 但是对于make goldfish_armv7_defconfig这样编译的内核模拟器好像启动不了,应该是默认编译成v5的,需要改成v7。或者可以改成ndk的编译器
    // CROSS_COMPILE ?= /home/kk/andr-perf/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-

  3. 开始编译,敲入如下命令
    make goldfish_defconfig
    或者看arch/arm/configs/目录下有什么,就挑一个make XXX

  4. 正式编译,敲入如下命令
    make

正式编译成功之后,我们会看到如下文字:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

三 利用新编译的kernel来启动模拟器

  1. 在启动模拟器之前,先设置模拟器的目录到环境变量$PATH中去:
    USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:~/android_prj/out/host/linux-x86/bin

  2. 设置ANDROID_PRODUCT_OUT环境变量:
    USER-NAME@MACHINE-NAME:~/Android$ export ANDROID_PRODUCT_OUT=~/android_prj/out/target/product/generic
    同样,如果你的源代码目录不是android_prj,请注意修改下。另外,如果你已经配置了环境变量。则不必如此。建议最好写到配置文件 ~/.bash_rc配置文件里面去。 免得每次都要配置

  3. 启动模拟器
    一、 cd ~/android_prj 回到源代码目录
    sandy@ubuntu:~/android_prj$ emulator -kernel ./kernel/arch/arm/boot/zImage 利用刚才我们编译的kernel内核启动模拟器
    二、 emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImage
    -avd后面的参数 myavd即为模拟器的名字,-kernel后面的参数就找到刚才编译出的内核的路径。
    若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

  4. 验证结果
    待模拟器启动完毕之后,我们敲入adb shell
    第一次会说device offline,不管它,再敲入一遍,就会进入adb 调试
    然后cd proc 进入proc目录,cat version

部分GCC选项

-Werror 和 -I 很有用
命令描述
-l library-llibrary 进行链接时搜索名为library的库。例子: $ gcc test.c -lm -o test
-Idir dir加入到搜索头文件的路径列表中。例子: $ gcc test.c -I../inc -o test
-Ldir dir加入到搜索库文件的路径列表中。例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test
-Dname 预定义一个名为name的宏,值为1。例子: $ gcc -DTEST_CONFIG test.c -o test
-Dname=definition 预定义名为name,值为definition的宏。
-ggdb -ggdblevel 为调试器 gdb 生成调试信息。level可以为1,2,3,默认值为2。
-g -glevel 生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level取值同上。
-s 去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
-M 告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个 源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 #include引用的所有文件。生成的规则可 以是单行,但如果太长,就用`/'-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。
-C 告诉预处理器不要丢弃注释。配合`-E'选项使用。
-P 告诉预处理器不要产生`#line'命令。配合`-E'选项使用。
-static 在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上 无效。
-nostdlib 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
Warnings
-Wall 会打开一些很有用的警告选项,建议编译时加此选项。
-W -Wextra 打印一些额外的警告信息。
-w 禁止显示所有警告信息。
-Wshadow 当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。
-Wpointer-arith 对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。
-Wcast-qual 当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。
-Waggregate-return 如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。
-Winline 无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。
-Werror 把警告当作错误。出现任何警告就放弃编译。
-Wunreachable-code 如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。
-Wcast-align 一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。
-Wundef 当一个没有定义的符号出现在 #if 中时,给出警告。
-Wredundant-decls 如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。

编译Android的perf

1 编译elfutils

elfutils源码

1
cp -r /home/kk/andr-perf/android-ndk-r10c/platforms/android-21/arch-arm arch-arm-21-ok
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cd elfutils
./configure --host=arm-none-linux-gnueabi

sed -i -e 's/^CC = gcc/CC = $(CROSS_COMPILE)gcc/g' *Makefile
sed -i -e 's/^CC = gcc/CC = $(CROSS_COMPILE)gcc/g' */Makefile
sed -i -e 's/^AR = ar/AR = $(CROSS_COMPILE)ar/g' */Makefile

Makefile
-SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \
+SUBDIRS = config libelf
+#SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \

libelf/Makefile
-AM_CFLAGS = $(am__append_1) -Wall -Wshadow -Werror \
+AM_CFLAGS = $(am__append_1) -Wall -Wshadow \

-               -Wl,--soname,$@.$(VERSION),-z,-defs,-z,relro $(libelf_so_LDLIBS)
+               -Wl,--soname,$@.$(VERSION),-defs,-z,relro $(libelf_so_LDLIBS)

bionic-fixup/AndroidFixup.h
-static inline char *stpcpy(char *dst, const char *src)
+static inline char *stpcpy_noneed(char *dst, const char *src)

host-darwin-fixup/AndroidFixup.h
-static inline size_t strnlen (const char *__string, size_t __maxlen)
+static inline size_t strnlen_noneed (const char *__string, size_t __maxlen)

libelf/elf32_updatefile.c
libelf/elf_begin.c
libelf/elf_getarsym.c
#include "bionic-fixup/AndroidFixup.h"
#include "host-darwin-fixup/AndroidFixup.h"

libelf/elf_error.c
#include "host-darwin-fixup/AndroidFixup.h"

export NDK_SYSROOT=/home/kk/andr-perf/arch-arm-21-ok
export NDK_TOOLCHAIN=/home/kk/andr-perf/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT} -I`pwd`/bionic-fixup"

2 编译内核

1
2
3
4
5
6
7
make goldfish_defconfig

Makefile:
 195 ARCH            ?= arm
 196 CROSS_COMPILE   ?= /home/kk/android/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-

make

3 编译perf,perf要放在goldfish-android-goldfish-3.4/tools/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
cp /home/kk/android/android-ndk-r10c/platforms/android-19/arch-arm/usr/include/asm/page.h /home/kk/andr-perf/arch-arm-21-ok/usr/include/asm

pwd
/home/kk/andr-perf/elfutils-android-4.4.4_r2.0.1/libelf
cp elf.h gelf.h libelf.h /home/kk/andr-perf/arch-arm-21-ok/usr/include/
cp libelf.a libelf.so /home/kk/andr-perf/arch-arm-21-ok/usr/lib/

pwd
/home/kk/andr-perf/goldfish-android-goldfish-3.4/tools/linux-tools-perf-android-4.4.4_r2.0.1
cp /home/kk/andr-perf/goldfish-android-goldfish-3.4/lib/rbtree.o util/
```

Makefile
-EXTLIBS = -lpthread -lrt -lelf -lm
+EXTLIBS = -lelf -lm

-               msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
+#              msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);


-$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
-       $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
+#$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
+#      $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<


perf.h
+#define __used__
+#define __force


util/util.h
+#include <linux/types_ws.h>  // 他会找到util/include/linux/types.h,导致没有include<linux/types.h>,会报没有__be32等错误


pwd
/home/kk/andr-perf/arch-arm-21-ok
cp ./usr/include/linux/types.h ./usr/include/linux/types_ws.h

/home/kk/andr-perf/arch-arm-21-ok/usr/include/linux/tcp.h 删掉下面这部分
 enum {
  TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
  TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
  TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
  TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
  TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
  TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
  TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
  TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
 };


export NDK_SYSROOT=/home/kk/andr-perf/arch-arm-21-ok
export NDK_TOOLCHAIN=/home/kk/andr-perf/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-

// 
make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT} -I`pwd`" LDFLAGS+=-static