将.org指令与.data节中的数据一起使用:与ld有关 [英] Using .org directive with data in .data section: In connection with ld

查看:143
本文介绍了将.org指令与.data节中的数据一起使用:与ld有关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在努力了解如何使用GNU binutils使用以下命令构建简单的引导加载程序的过程中 gas 我遇到了一个问题,怎么办您告诉链接器将数据放置在使用.org扩展位置计数器的文件中,同时将文件大小保持为512字节的位置.我似乎找不到办法.

In my efforts to understand how to use the GNU binutils to build a simple boot loader using gas I have come across the question, how do you tell the linker where to put your data, in a file that uses .org to advance the location counter while keeping the file size at 512 bytes. I can't seem to find a way to do this.

尝试执行此操作的汇编程序是:

The assembly program that tries to do this is:

# Author: Matthew Hoggan
# Date Created: Tuesday, Mar 6, 2012

.code16                      # Tell assembler to work in 16 bit mode
.section .data
msg:                         # Message to be printed to the screen
  .asciz "hello, world"

.section .text
.globl _start                # Help linker find start of program
_start:
  xor  %ax,  %ax             # Zero out ax register (ah used to specify bios function to Video Services) 
  movw %ax,  %ds             # Since ax is 0x00 0x00 use it to set data segment to 0
  mov  $msg, %si             # Use source index as pointer to string

loop:
  movb %ds:(%si), %al        # Pass data to BIOS function in low nibble of ax
  inc  %si                   # Advance the pointer
  or   %al, %al              # If byte stored in al is equal to zero then...
  jz   _hang                 # Zero signifies end of string
  call print_char            # Print current char in al
  jmp loop                   # Repeat

#
# Function that uses bios function calls
# to print char to screen
#
print_char:
  movb $0x0e, %ah             # Function to print a character to the screen
  movb $0x07, %bl             # color/style to use for the character
  int  $0x10                  # Video Service Request to Bios
  ret

#
# Function used as infinite loop
#
_hang:
  jmp  _hang

.org 510
.byte 0x55, 0xAA

.end


更新 使用以下命令,我得到以下错误:


UPDATE Using the following commands I get the following error:

mehoggan@mehoggan-laptop:~/Code/svn_scripts/assembly/bootloader/gas$ ld --oformat binary -o string string.o 
string.o: In function `_start':
(.text+0x5): relocation truncated to fit: R_X86_64_16 against `.data'

推荐答案

对于这种工作,您应该编写自己的

For this kind of work you should write your own linker script. Just pass it to the linker with the -T option.

我遇到的几乎相同问题的脚本是:

My script for an almost identical problem was:

SECTIONS
{
    . = 0x1000;
    bootsec :
    {
        *(.text)
        *(.data)
        *(.rodata)
        *(.bss)
        endbootsec = .;
        . = 0x1FE;
        SHORT(0xAA55)
    }
    endbootsecw = endbootsec / 2;
    image = 0x1200;
}

有了这个技巧,您不必将0x55 0xAA放到汇编器中!

With that trick you don't event need to put the 0x55 0xAA in the assembler!

开头的0x1000:实际上所有跳转都是相对的,因此没有使用,但是稍后需要将其跳转到保护模式...

The 0x1000 at the beginning: Actually all the jumps are relative, so that is not used, but it is needed later for the jump into protected mode...

endbootsecwendbootsecimage是代码中其他位置使用的符号.

endbootsecw, endbootsec and image are symbols used elsewhere in the code.

这篇关于将.org指令与.data节中的数据一起使用:与ld有关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆