bootloader ld 0x10000 relocation truncated to fit: R_X86_64_16

发布于 2022-09-12 02:30:37 字数 959 浏览 17 评论 0

.intel_syntax noprefix
.code16
.text
.globl _start
_start:
    mov    ax,    cs
    mov    ds,    ax
    mov    es,    ax
    mov    ax,    0x00
    mov    ss,    ax
    mov    sp,    0x7c00

    mov    ax,    0x1301
    mov    bx,    0x000f
    mov    dx,    0x0200        # row 2
    mov    cx,    12
    push    ax
    mov    ax,    ds
    mov    es,    ax
    pop    ax
    lea    bp,    StartLoaderMessage
    int    0x10

    jmp    $

StartLoaderMessage:    .ascii    "Start Loader"

操作:

$ as -o loader.o loader.s
$ ld -Ttext 0x10000 --oformat=binary loader.o -o loader.bin # 0x10000刚好1M // 报错
loader.o: In function `_start':
(.text+0x22): relocation truncated to fit: R_X86_64_16 against `.text'+28
$ ld -Ttext 0x7c00 --oformat=binary loader.o -o loader.bin2 # 正常

将loader.bin2文件反编译后发现StartLoaderMessage是绝对定位, 使用0x10000时超过了real mode 16-bit寻址规定的1M空间, 请问这种情况要怎么解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文