热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FreepascalforCE和gccforarm的联合编译

在smartphone上通过了测试.sha1.c来自于ChristopheDevine,我把sha1_file包围在ifdefKOL_MCK里面了,这样我是自己实现Sha1Stream,对文

在smartphone上通过了测试.sha1.c来自于Christophe Devine, 我把sha1_file包围在ifdef KOL_MCK里面了, 这样我是自己实现Sha1Stream, 对文件流式操作, 而不必使用gcc的stdio.makefile如下

CC = arm-wince-mingw32ce-gcc
CCOPTS = -c -O3 -s -Os -fomit-frame-pointer -DKOL


all: gcc

gcc: sha1_gcc_coff.o


%_gcc_coff.o: %.c
 $(CC) $(CCOPTS) -o $@ $^



.PHONY: all clean
clean:
 @rm -f *.o

编译后, 得到sha1_gcc_coff.o, 并编写对应的链接单元sha1obj.pas. 有个诡异的现象是cegcc编译出来的obj, 其名称修饰并没有遵循cdecl的惯例来, 而是默认去掉了一切decoration. 不过按照经验, 还是将exerenal声明为cdecl, 同时实现了sha1stream, 和撰写了给sha1_gcc_coff.o使用的memcpy, memset. Freepascal for ce的版本有2个,我用的是lazarus的2.2.1, 而FP的是2.2.0. 唯一区别的是因为我需要经常用到Freepascal的x86版, 所以默认的fpc.cfg懒得修改, 就拿lazarus的另放目录来用了. fpc.cfg的修改, 按照ceport和我所使用的KOLCE的声明判断, 内容如下
-Twince

#Library path
-FuF:/lazarus/fpc/2.2.1/units/arm-wince
-FuF:/lazarus/fpc/2.2.1/units/arm-wince/*
-FuF:/lazarus/fpc/2.2.1/units/arm-wince/rtl
-FuF:/lazarus/fpc/2.2.1/units/arm-wince/kol
-FiF:/lazarus/fpc/2.2.1/units/arm-wince/*
-FiF:/lazarus/fpc/2.2.1/units/arm-wince/kol
-FlF:/lazarus/fpc/2.2.1/units/arm-wince/3rdwork
-FuF:/KOL/3rdWork/MHXP
-FuF:/KOL/3rdWork/Misc


-XParm-wince-
-FDF:/lazarus/fpc/2.2.1/bin/i386-win32


# For a release compile with optimizes and strip debuginfo
#IFDEF RELEASE
-Og1p2
-Xs
#KOL
-Mdelphi
-CX
-Sg


#WRITE Compiling Release Version
#ENDIF


# For a debug version compile with debuginfo and all codegeneration checks on

#IFDEF DEBUG
-gcl
-Crtoi
-Sg
#KOL
-Sa
-Mdelphi
#WRITE Compiling Debug Version
#ENDIF



-l


-viwh

为了不占版面, 删掉了块状注释. 代码是顺便加在PQVGen里面的, 其工程的makefile很短,  
CC = ppcrossarm
CCOPTS = -dKOL_MCK -dF_P


all: clean release

debug: Debug/PQVGen.exe
release: Release/PQVGen.exe



RELEASE/PQVGen.exe: PQVGen.dpr
 $(CC) $(CCOPTS) -dRELEASE -FERelease $^


clean:
 rm -f Release/*.o
 rm -f Release/*.ppu
 rm -f Release/*.exe

make一下, link不过, 报告找不到memcpy和memset外部符号,用IDA查看了编译出的sha1obj.pas, 发现其生成的memcpy导出名称被加上了单元名前缀和参数类型作为修饰,给声明增加名称限定符失败, 在单元内增加exports的重命名失败. 直观的感觉应该单独写一个单元, 设法使用强制不修饰名称的方式link,再{$LINK}到sha1obj.pas里面, 不过开源项目的缺点又来了, 这个CE版木得文档, 连主分支的文档都没有提到名称修饰的任何信息.于是使用{$LINKLIB libcoredll.a}的方式, 无耻的将gcc的lib直接拿来加入链接, 一阵咯吱咯吱后, 过鸟. 最在mainunt.pas里面增加了一个点击事件,执行了一条邪恶代码 var
  dige: SHA1_DIGEST;
  azsd: String;
begin
  azsd := 'azsd';
  sha1(@azsd[1], Length(azsd), dige);
  ShowMessage(Dump2Hex(@dige[0], SizeOf(dige)));
end;
这样如果调用约定的声明错了的话, 点击就会爆掉鸟. 链接后, 拷贝到windows mobile 6的smartphone上, 点击, 华丽的弹出了计算后的熟悉hash, 成功了. 明天得去freepascal的maillist里面询问一下了, 为啥再兼容delphi编译指示字的模式下,同单元内补充外部引用和dcc的编译器处理方式不一样, 因为问题的表面现象是在整个工程编译时候sha1_gcc_coff.o才加入编译,导致找不到sha1obj里面的memcpy函数, 其实是在编译sha1obj单元的时候,没有将sha1_gcc_coff.o静态链接到sha1obj.o里面去,自然也没有将sha1obj.pas里面为sha1_gcc_coff.o所需要的外部引用添加的实现作内部连接.


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
author-avatar
手机用户2502927203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有