- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试生成 16 位 DOS 可执行文件,但使用的是 gcc 编译器。所以我使用的是古老的 gcc-4.3 ia16 端口。我制作了我的构建的 Docker 镜像:https://registry.hub.docker.com/u/ysangkok/ia16-gcc-rask
这是我正在尝试的:
host $ mkdir results
host $ docker run -v $PWD/results:/results -it ysangkok/ia16-gcc-rask
container $ cd results
我没有包含头文件,因为 gcc 不能使用 OpenWatcom 的 libc 头文件。
container $ echo 'main() { printf("lol"); }' > test.c
我没有链接,因为我没有可用的 16 位 binutils。如果我构建目标文件,它不会正确标记为 16 位。
container $ /trunk/build-ia16-master/prefix/bin/ia16-unknown-elf-gcc -S test.c
现在我有了这个程序集文件:
.arch i8086,jumps
.code16
.att_syntax prefix
#NO_APP
.section .rodata
.LC0:
.string "lol"
.text
.p2align 1
.global main
.type main, @function
main:
pushw %bp
movw %sp, %bp
subw $4, %sp
call __main
movw $.LC0, %ax
pushw %ax
call printf
addw $2, %sp
movw %bp, %sp
popw %bp
ret
.size main, .-main
.ident "GCC: (GNU) 4.3.0 20070829 (experimental)"
容器外,宿主机内,我尝试用yasm组装:
% yasm -m x86 -p gas -f elf -o test.o test.s
test.s:1: warning: directive `.arch' not recognized
test.s:3: error: junk at end of line, first unrecognized character is `p'
我把语法行注释掉,因为 yasm 不理解它,然后重试,这次成功了。
我测试重定位符号:
% objdump -r test.o
test.o: file format elf32-i386
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000007 R_386_PC16 __main
0000000a R_386_16 .rodata
0000000e R_386_PC16 printf
遗憾的是它们是 32 位的。当我尝试在容器中进行链接时,它不起作用:
root@1341f35c4590:/# cd ow/binl/
root@1341f35c4590:/ow/binl# WATCOM=/ow /ow/binl/wlink
Open Watcom Linker Version 1.9
Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
Press CTRL/D to finish
WLINK>system dos
WLINK>file /results/test.o
[ comment: i press control-d on the next line ]
WLINK>loading object files
Warning! W1080: file /results/test.o is a 32-bit object file
Error! E2015: file /results/test.o(test.s): bad relocation type specified
Error! E2015: file /results/test.o(test.s): bad relocation type specified
Error! E2015: file /results/test.o(test.s): bad relocation type specified
如果我尝试制作 COFF 而不是 ELF,yasm 甚至无法组装:
root@1341f35c4590:/# cd ow/binl/
root@1341f35c4590:/ow/binl# WATCOM=/ow /ow/binl/wlink
Open Watcom Linker Version 1.9
Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
Press CTRL/D to finish
WLINK>system dos
WLINK>file /results/test.o
WLINK>loading object files
Warning! W1080: file /results/test.o is a 32-bit object file
Error! E2015: file /results/test.o(test.s): bad relocation type specified
Error! E2015: file /results/test.o(test.s): bad relocation type specified
Error! E2015: file /results/test.o(test.s): bad relocation type specified
我知道 yasm 不支持 16 位,但也许有解决方法?有 GAS 兼容的 16 位汇编器吗? GAS-to-Intel 转换器不工作。
最佳答案
我不是专家,但据我所知,没有 16 位 GAS 兼容的汇编程序。
此外,gcc 从未打算生成 8086 16 位代码。 Rask 端口在某种意义上产生 16 位代码默认情况下,操作数大小为 16 位。所以像 mov ax, 1234h
这样的指令被发出为 b8 34h 12h
而不是 66 b8 34h 12h
这将是在实模式下解释为 mov eax, xxxx1234h
(如果您在 80386+ 上运行)
地址模式也是如此。
问题是这只是代码,目标文件格式仍然是 32 位的,所以它们最终会被 32 位工具使用,用于v86环境。例如,ELF 不支持 16 位重定位,COFF 也不支持(根据 nasm)。
因此,即使 GCC 和 GAS 生成 16 位代码,它们也只输出相对较新的对象格式。每个给定目标文件的工具都会创建 MZ 或 COM 可执行文件,这些工具是在这些格式之前创建的,并且不支持它们。由于很久以前就不再使用 DOS,因此没有努力增加对新格式的支持。
我只能想出两种非常非常困难的方法,将 gcc 用作编译器。
使用 -masm=intel
标志组装源文件以获得 Intel 语法。然后你需要一个工具来将 GAS 点指令转换为 NASM 指令。这必须手动编码。它们中的大多数都是简单的替换,例如 .global
XXX 到 GLOBAL XXX
但您需要转换有效地址和为未定义的函数添加 EXTERN XXX
。
您不得使用任何外部符号并生成 PIC 代码(-fPIC
标志)和原始二进制文件(即只是代码)。定义一个函数指针结构,一个用于您需要使用的每个外部函数,类似于
struct context_t{ int (*printf)(char* format, ...); ...};然后声明一个指向
context_t
的指针,比如
context_t* ctx
;如果您需要使用像
printf
这样的函数,请改用
ctx->printf
。编译代码。
现在创建一个 C 源代码,将其称为加载器,它定义一个 context_t
类型的变量并初始化其指针。然后加载器必须读取二进制文件,找到为 ctx
指针分配的空间并将其设置为其 context_t
变量的地址,然后将二进制文件加载到内存中(在段边界处)并通过远调用执行它。
需要找到指针在文件中的位置,可以使用GCC生成的映射文件(-Xlinker -Map=output.map
开关)或者使用签名像旧的 BIOS PCI 32 位服务($PCI 签名)并扫描它。请注意,GCC 生成的代码可能会施加其他约束,但 PIC 开关应将其最小化。您可以在加载程序之后追加二进制文件(请注意,如果您使用 MZ 格式并注意对齐)并简化事情。
关于c - 如何组装 GAS 程序集并将其与 Open Watcom C 库链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191000/
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!