c - 编译 ld86 时出现问题 : Undefined symbol auto_start

标签 c assembly bcc-compiler

我正在尝试使用 ld86 编译一些汇编代码和 C 代码。这样做时,我遇到了一个问题:“ undefined symbol :auto_start”

我已经搜索过这个,并发现了this堆栈溢出问题,和我的一模一样。但是,他们从主函数中删除参数的解决方案对我不起作用。我正在寻找更多潜在的选择。

ld86 -d bs.o t.o /usr/lib/bcc/libc.a
ld86: warning: _gets redefined in file 
/usr/lib/bcc/libc_s.a(gets.o); using definition in t.o
undefined symbol: auto_start

我的 t.c 代码:

1 #include <string.h>
2 #include <stdio.h>
3 int prints(char *s)
4 {
5   int i;
6   for(i = 0; i<strlen(s); i++)
7   {
8     putchar(s[i]);
9   }
10   return 0;
11 }
12 
13 int gets(char name[])
14 {
15   int i = 0;
16   char c = 0;
17   while(c != '\n')
18   {
19     c = getc(stdin);
20     name[i] = c;
21     i++;
22   }
23   name[i-1] = 0;
24   return 0;
25 }
26 
27 int main()
28 {
29   char name[64];
30   prints("Welcome to my Booter!\n");
31   while(1)
32   {
33     memset(name,0,64);
34     prints("What is your name?\n");
35     gets(name);
36     if(name[0] == 0)
37     {
38       break;
39     }
40     prints("Welcome "); prints(name); prints("\n\r");
41   }
42   prints("Return to assembly and hang\n\r");

还有废话:

BOOTSEG =  0x9000        ! Boot block is loaded again to here.
    SSP      =   8192        ! Stack pointer at SS+8KB

    .globl _main,_prints              ! IMPORT symbols
    .globl _getc,_putc                ! EXPORT symbols

.globl _readfd,_setes,_inces,_error  

    !-------------------------------------------------------
    ! Only one SECTOR loaded at (0000,7C00). Get entire BLOCK in
    !-------------------------------------------------------
    mov  ax,#BOOTSEG    ! set ES to 0x9000
    mov  es,ax
    xor  bx,bx          ! clear BX = 0

    !---------------------------------------------------
    !  read boot BLOCK to [0x9000,0]     
    !---------------------------------------------------
    xor  dx,dx          ! drive 0, head 0
    xor  cx,cx          ! cyl 0    sector 0
    incb cl             ! cyl 0, sector 1
    mov  ax, #0x0202    ! READ 1 block
    int  0x13

    jmpi    start,BOOTSEG           ! CS=BOOTSEG, IP=start

start:                    
    mov     ax,cs                   ! Set segment registers for CPU
    mov     ds,ax                   ! we know ES,CS=0x9000. Let DS=CS  
    mov     ss,ax                   ! SS = CS ===> all point at 0x9000
    mov     es,ax
    mov     sp,#SSP                 ! SP = 8KB above SS=0x9000

    mov     ax,#0x0012              ! 640x480 color     
int     0x10 

    call _main                      ! call main() in C

    test ax, ax
je  _error 

    jmpi 0,0x1000


    !---------------------------------------------
    !  char getc()   function: returns a char
    !---------------------------------------------
_getc:
    xorb   ah,ah           ! clear ah
    int    0x16            ! call BIOS to get a char in AX
    ret 

    !----------------------------------------------
    ! void putc(char c)  function: print a char
    !----------------------------------------------
_putc:           
    push   bp
    mov    bp,sp

    movb   al,4[bp]        ! get the char into aL
    movb   ah,#14          ! aH = 14
    movb   bl,#0x0D        ! bL = cyan color 
    int    0x10            ! call BIOS to display the char

    pop    bp
    ret




   !---------------------------------------
   ! readfd(cyl, head, sector, buf)
   !         4     6     8     10
   !---------------------------------------
_readfd:                             
    push  bp
    mov   bp,sp            ! bp = stack frame pointer

    movb  dl, #0x00        ! drive 0=FD0
    movb  dh, 6[bp]        ! head
    movb  cl, 8[bp]        ! sector
    incb  cl               ! BIOS count sector from 1
    movb  ch, 4[bp]        ! cyl
    mov   bx, 10[bp]       ! BX=buf ==> memory addr=(ES,BX)
    mov   ax, #0x0202      ! READ 2 sectors to (EX, BX)

    int  0x13              ! call BIOS to read the block 
    jb   _error            ! to error if CarryBit is on [read failed]

    pop  bp                
    ret


_setes:  push  bp
     mov   bp,sp

     mov   ax,4[bp]        
     mov   es,ax

     pop   bp
     ret

_inces:                         ! inces() inc ES by 0x40, or 1K
     mov   ax,es
     add   ax,#0x40
     mov   es,ax
     ret

    !------------------------------
    !       error & reboot
    !------------------------------
_error:
    mov  bx, #bad
    push bx
    call _prints

    int  0x19                       ! reboot

最佳答案

经过多次故障排除后:我发现我需要删除 C 文件顶部的 include 语句,并删除 main 函数中的参数。因此,链接页面部分正确。

关于c - 编译 ld86 时出现问题 : Undefined symbol auto_start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54115974/

相关文章:

c - BCC 中的内联汇编(Bruce 的 C 编译器)- 如何使用 C 变量?

编译 bcc 兼容性问题

c - 当任何两个数字之和超过最大值时,C 程序计算如何或以什么程序运行?

c - Id 返回 1 退出状态 - 文件读取

c++ - 太阳光栅图像 : Why 1 byte row padding when width is odd?

assembly - 这段简单的代码有什么问题?

c - 程序处理

c - 使用指向结构的指针或引用

c - STM32F7 : hard fault when jumping to application from custom bootloader

linux - ld86 编译时出现 auto_start 错误