问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

crtend_android.o 是什么

发布网友 发布时间:2022-04-25 14:23

我来回答

1个回答

热心网友 时间:2023-10-31 01:11

为了给Android编译程序,你需要ARM工具链(toolchain). 我发现有两种主张,分别是使用Android Prebuild toolchain和CodeSourcery

1)Android Prebuild toolchain

Android没有使用传统的libc库.相反,它用了Bionic库,一个由Google开发的,用在Android移动软件平台上的轻量级的libc

Bionic被裁剪到只支持 Android系统.  请看 六百万美元的c程序库


2)CodeSourcery

CodeSourcery是ARM的合作伙伴. 专门为ARM处理器开发增强GUN工具链的,并提供验证过的GNU工具链.这些工具链有很多不同的版本.

对于Android平台,需要 arm-none-linux-gnueabi, 而 arm-none-eabi是没有glibc包含在里面的,主要面向那些编译完整的native库和应用(比如FreeRTOS)

译者注: arm-none-eabi就是用来编译裸机程序的,请参考 最简单的ARM裸机程序


我个人的观点,如果白手起家开始创建一个Android的应用程序,你应该选择Bionic.

但是如果你选择从你的PC环境移植一个库到Android,你应该选择CodeSourcery

如果你使用到线程或者C++异常,Bionic库也不能完全支持它们(实际上,它根本就不支持异常)


agcc.pl是Andrew Ross开发的一个脚本,让你以一种很简单的方法来自动包含常用的库,使用Android的ARM工具链gcc

某种程度上,他像makefile


第1种方法  使用Makefile和Android NDK

AR = arm-linux-androideabi-ar

AS = arm-linux-androideabi-as

CC = arm-linux-androideabi-gcc

CXX = arm-linux-androideabi-g++

LD = arm-linux-androideabi-ld.gold


NDK_KIT = /home/tim/android-ndk-r10b

PLATF_KIT = platforms/android-9


ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include

ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/lib


OBJS = hello.o

EXES = hello


hello :  hello.o

$(LD) --dynamic-linker=/system/bin/linker -nostdlib \

-rpath-link=$(ARM_LIB) \

$(ARM_LIB)/crtbegin_dynamic.o \

-L$(ARM_LIB)  -lc \

-o hello hello.o

hello.o: hello.c

$(CC) -I $(ARM_INC) -c hello.c


clean:

rm -f $(OBJS) $(EXES)


源代码

#include <stdio.h>


int main(int argc, char* argv[])

{

printf("Hello Android\n");

return 0;

}

设置环境变量 envsetup.sh

export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin

最后,运行 make 就可以了


关于 -rpath-link选项,请参考 gcc链接选项




第二种简单方法,使用shell脚本

#!/bin/sh


OS='linux'

ANDROIDSDK='android-14'


PROGDIR='/home/tim/android-ndk-r10b/'


PROGDIR=`cd $PROGDIR && pwd`

ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib

ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include

ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"


LINKER=/system/bin/linker


echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@

echo "CRT:"$ARMEABICRT


$ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc

保存为b

/b hello.c -o hello

就可以了


实际就是运行命令

/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \

-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker \

-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib  \

/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o   /home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o  \

-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include -nostdlib -lc \

hello.c -o hello


crtbegin_dynamic.o 和 crtend_android.o必须配对使用


第三种方法,用–sysroot也是可以的

#!/bin/sh


NDK=/home/tim/android-ndk-r8e

SYSROOT=$NDK/platforms/android-9/arch-arm

CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"

CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'

LDFLAGS='-Wl,--fix-cortex-a8'

$CC $@

http://www.srombauts.fr/2011/03/06/standalone-toolchain/

#include  <stdio.h>

#include <android/log.h>


#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-ndk", __VA_ARGS__))


int main(void)

{

printf("Hello from NDKn");

LOGI("Hello from NDK");

return 0;

}

果然厉害,上面这段代码都可以这样编译


./b9 -l log nl.c -o hn


用Makefile也能搞

CC  = arm-linux-androideabi-gcc

CFLAGS  = -Wall -g

LDFLAGS = -llog

SRC =hello-ndk.c

OBJ =$(SRC:.c=.o)

EXE =hello-ndk


all: $(SRC) $(EXE)


$(EXE): $(OBJ)

$(CC) -o $@ $^ $(LDFLAGS)


%.o: %.c

$(CC) -o $@ -c $< $(CFLAGS)


clean:

rm -f *.o $(EXE)


编译so库也是可以,厉害

CC  = arm-linux-androideabi-gcc

CFLAGS  = -Wall -g

LDFLAGS = -llog -shared

SRC =hello-ndk.c

OBJ =$(SRC:.c=.o)

EXE =libhello-ndk.so


还可以直接运行 gcc

/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm   -lc -lm   -g main.c -o mm


第4种方法,用ndk-build

创建工程目录hello,然后在其下创建子目录jni

然后在jni下创建两个文件,一个是hello.c,另外一个是Android.mk,内容如下

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=hello.c

LOCAL_MODULE := helloworld

LOCAL_MODULE_TAGS := optional

nclude $(BUILD_EXECUTABLE)


其中 LOCAL_MODULE_TAGS := optional  这行可以不要


进入到hello目录下,运行下面的命令

# export NDK_PROJECT_PATH=`pwd`

# ndk-build

Compile thumb  : helloworld <= hello.c Executable     : helloworld Install        : helloworld => libs/armeabi/helloworld

如何使用自己的makefile编译android ndk项目

crtend_android.o 这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。

Load Port、SMIF

威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...

如何用Android NDK编译FFmpeg

b.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。c.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是...

如何在CoIDE中使用C++

KEEP (*crtbegin.o(.ctors))KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))KEEP (*(SORT(.ctors.*)))KEEP (*crtend.o(.ctors))_ctor_end = .;. = ALIGN(4);KEEP (*crtbegin.o(.dtors))KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))KEEP (*(SORT(.dtors.*)))KEEP (*crtend.o...

Android学习之Build环境介绍

|-- adbs这是一个用来查看crash问题的工具,详细请看《Android调试工具之adbs》|-- Android.mk|-- apicheck用来进行发布前的API检查(参见mydroid/build/core/tasks/apicheck.mk),是否新编译的系统中有破坏API兼容性或是非法的API这里的代码是用Java写的用来检查编译时生成的API相关信息的xml文件(...

有关I/O的DOS功能调用(在CRT上输出字符GOOD AFTERNOON)

这个看起来有点像搞逆向工程的 老大希望说明白点那种编程语言

android adt so死机

so文件这个汇编不好找,你只能多打log,根据你当前的log状态去看哪里崩溃了,另外,你也可上传点其他的log,应该不止你这么几行汇编的log,有其他前后的log可以更好定位点

常用电脑英语 200分收集

O Object embedding对象嵌入 Object linking目标链接 Open architecture开放式体系结构 Optical disk光盘 Optical mouse光电鼠标 Optical scanner光电扫描仪 Outline大纲 off-line browsers离线浏览器 Online storage联机存储 P palmtop computer掌上电脑 Parallel ports并行端口 Passive-matrix被动矩阵 PC card个人计算机卡 ...

VB 将十进制变成十六进制出问题

改:Dim VScrt(0) As Byte 为Dim VScrt(0) 试试

26个字母的HUFFMAN建立和编码器的实现

'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};//26个字母 int weit[NUM]={856,139,279,378,1304,289,199,528,627,13,42,339,249,707,797,199,12,677,607,1045,249,92,149,17,199,8};//出现频率 Node nodes[TNUM]; //用对象数组存储哈夫曼...

怎样消除编译器关于 C++11 的警告

.s)。编译的命令为:gcc –S hello.i –o hello.s或者从源文件直接输出汇编代码文件:gcc –S hello.c –o hello.s现在版本的GCC把预编译和编译两个步骤合并成一个步骤,由程序cc1来完成(C++为cc1plus)。3. 汇编汇编就是将汇编代码转变成机器可以执行的命令,生成目标文件(...

android4.4.4 at the end of at the end of用法 有没有in the end of on the moment android 9.0 to the end用法 android O android 7
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
云南北辰高级中学简介 如何自制美味的芹菜炒粉丝? 学电脑专业需要懂电脑原理和打字吗 大学里会专门学习五笔打字(电脑专业的)吗?谢谢 肝腹水可以治疗好吗 肝腹水体重增加怎么治疗 我想买一个平板电脑,有这样的要求:价格在1000左右,朝左,可以外接键鼠... 我妈不会在电脑上打字,请问能到那里找些有用的软件来帮帮她?希望能多... 4000能买到既能流畅玩游戏又能练打字的电脑吗在哪买 家庭阳台草莓种植方法下雨怎么办 成语中人名的含义? 如何定制android源码的编译选项 后期安装 写出成语中主人公的名字 如何把android-formatting.xml和android.importorder导入eclipse中 如何更新android系统中到Setting.apk 卫生间防水胶干了长期泡水里好吗? 卫生间防水胶干了长期泡水里好吗? 写出成语故事中的人名 linux命令 launch是什么命令? 卫生间的防水胶可以自己买些什么材料配制 卫生间的防水胶可以自己买些什么材料配制 成语里有人名的成语 如何在Linux平台下编译android工程 用什么胶水可以防止漏水 如何确定本次编译的deconfig文件 可以浸水的胶水是什么胶水。用来粘游泳池的? 可以浸水的胶水是什么胶水。用来粘游泳池的? 成语里含有人名的有哪些? 如何把行间距设为1.35??? bash: build/envsetup.sh: 没有那个文件或目录 怎么解决? 成语人名 Linux下NDK编译出的SO库能在WIndows下的android工程直接使用么 带有成语的人名 人名成语 如何单独编译Android源代码中的模块 王任重是那个成语中的人名 下面人名各取自什么成语 杜鹏程 ( 形容女孩手的语句有哪些? 我是滴滴司机,这个投诉率是什么意思? 滴滴车主的投诉率是什么意思 滴滴扣分、申诉成功,分数为什么没恢复? 谁知道滴滴打车上的司机怎么投诉啊? 投诉滴滴打车司机如何处理? 如何查询滴滴顺风车乘客对车主的投诉情况? 在word2016中,对图片设置什么环绕方式后,可以形成水印效果? Word文档中如何增加多行文字水印?求解答 电脑上的图片怎么缩小 怎么用电脑做图片.或在图片上加好 在电脑上怎么在图片上插入图片 win11如何让应用不出现在任务栏角图标(右下),也不出现在角溢出?