如何将 ELF 格式的 .o 文件编译到 Delphi 的项目中....(200分)

  • 主题发起人 主题发起人 OopsWare
  • 开始时间 开始时间
试试把它编译到用c写的dll中,然后用Delphi调用该dll,不知行不行,具体做法
我不会。
 
elf是什么?
 
肯定不行
elf是linux下面
kylix有可能
 
ELF 格式的 .o 文件在 Unix、Linux、FreeBSD 下很常见,就是 Windows 下的 .obj 文件。
.o 文件是在 windows 下用 NASM.EXE 加 elf 参数编译得到的,既然可以连接出 windows
下的可执行文件, Delphi 用该有办法引用。
帮帮忙....
 
nasm本身就支持多平台编译
而nasm 加elf编译出来的是.o文件
delphi又不支持
所以没办法
 
ELF 好像在加载时没有地址重定向,类似do
S 下的 .COM 文件。
如此一来是否可以这样:将 .o 读入内存,定义一个函数变量的指针
指向此 Buffer 的一个点, 然后调用 ..... [?]
 
elf本身内部一些数据只有linux才支持
不过也有cygwin for window好像也可以支持
 
Delphi不是跨平台的编译器,它不能生成跨平台的二进制代码或者中间代码。所以,它肯定不
能用.o
不过你可以考虑使用Free Pascal Compiler,在我所掌握的资料中,它可以生成和使用ELF格
式的代码。而且,它与Delphi/OOP Pascal兼容性非常高。
 
to aimingoo:
同意你的话:“你可以考虑一下Free Pascal, 或者它是一个从.o到.dll的桥梁.”
但反编译 Foicq 的作者,既然可以将反编译出的代码在linux下编译,为何不在
windows下直接使用,而生成 .dll 。这儿一定有问题。也有可能像热血说的,
windows下就根本不能使用 ELF 的目标文件。
我考虑有没方法,将 .asm 的代码像 在 Z80 上写程序时,将代码查表之接翻译
成机器码,再以常量连接到程序的数据段。以函数指针调用常量的地址?
 
OH...
OopsWare, 你绕远了.
没有必要用对照表对译成机器码. 不同操作系统之间, 汇编的主要不同不在于代码与机器码
的转换(这种转换通常是一样的), 而是主要在于文件载入头的格式, 代码段, 数据段, 堆栈段
的位置,定义以及操作方法.
我们假设在.asm中用.strack定义好了堆栈, 则可能存在的问题只是在Linux上如何用它和在Windows
上如何用它的问题, 而并不是如何将它转换成对应的机器码.
我所指的用FreePascal来作为桥梁, 只是一个可以尝试的想法, 并不一定有可行性. 相反, 我还
是认为修改反汇编代码, 然后在NASM中重编译更为可行.
从汇编的实现上来看, 你可以只需要改动不多的一些标志或者定义就可以了. 不过, 这终归要到
^^^^^^^^^^^^^^^^^^^
NASM, ELF和DLL等的一些规则和格式要有了解, 我却是没时间来做这件事了.
我还是建议你回到.asm文件上.
 
正在研究 Free Pascal,发现编译开关中有如下选项:
是否说明了ELF只能用到linux下.
X:>PPC386.EXE /?
Processor specific options:
-A<x> output format:
-Aas assemble using GNU AS
-Aasaout assemble using GNU AS for aout (Go32v1)
-Anasmcoff coff (Go32v2) file using Nasm
-Anasmelf elf32 (Linux) file using Nasm
-Anasmobj obj file using Nasm
-Amasm obj file using Masm (Microsoft)
-Atasm obj file using Tasm (Borland)
-Acoff coff (Go32v2) using internal writer
-Apecoff pecoff (Win32) using internal writer
 
to all:
X:>NASM -f win32 qqtmp.asm
可以编译出 win32 下的 .obj 文件,并可以被 Free Pascal 调用!( Delphi不行 )
我刚发现的,看来我真的在走弯路,多谢 aimingoo 提示。
link 时, ppc 提示没有 memset , malloc 等的入口 .. ( 看来需要 c 的编译环境 )
一直没找到 gcc for windows 。印象中还有 TinyC++ 的,也找不到了,装 VC 试试
....

 
新的可行思路:
1.为 FreePascal 创建一个新的库 .lib 包含 qqtmp.obj 使用的函数如 : memset, alloc..
2.用 FreePascal 将 qqtmp.obj + 新的 .lib 编译得到 qqtmp.dll
Delphi就可以使用 qqtmp.asm 了。 OICQ 的 Delphi 控件即将问世,哈哈 ....
 
哈哈哈,好呀好呀。
对了,OpenSource否? ^-^
 
学习.lp414@sina.com
 
我发现delphi6可以直接用external来声明.o文件中的函数?
 
qqtmp.obj 文件中的 memset, alloc 是 gcc 库中的东西, 连接需要用 gcc 的库。
FreePascal 好像还是解决不了,于是又找来 gcc for windows 连接,错误提示
竟然与 Delphi 和 BCB 一样: 找不到 memset, alloc .....
 
我的思路:
学习一下用ASM写DLL
把里面的ASM代码写成DLL
然后把C SRC原理分析清楚,改成DELPHI SRC,然后调用ASM写成的DLL
 
后退
顶部