gpt4 book ai didi

c - ld 使我的所有函数都链接到头文件中的最后一个函数

转载 作者:行者123 更新时间:2023-11-30 17:12:00 26 4
gpt4 key购买 nike

出于学习目的,我已经开始开发自制操作系统。所以它的工作原理如下:

  • 加载内核后,我会创建一个堆栈并调用 kmain()
  • 在 kmain 中,我尝试调用 header.h 中定义的函数 foo()

    //Header.h
    #ifndef INCLUDE_HEADER_H
    #define INCLUDE_HEADER_H

    int foo(char* buf);
    int bar();

    #endif

在我的内核上使用 nm,我可以清楚地看到 foo() 在二进制文件中,但是当我使用 gdb 反汇编 kmain 时,我发现 foo 没有被调用,而是 bar 被调用。

此问题在包含多个函数的所有 header 中反复出现。

我在 Windows 10 的 Cygwin 环境中进行编译。我在 makefile 中使用传递给 nasm/gcc/ld 的以下参数

    CC = gcc
CFLAGS = -m32 -nostdlib -nostdinc \
-nostartfiles -fno-leading-underscore -nodefaultlibs\
-Wall -Wextra -Wno-unused-variable -Wno-unused-function\
-c
LD = i686-elf-ld
LDFLAGS = -Tlink.ld -melf_i386
AS = nasm
ASFLAGS = -f elf

有什么想法吗?

编辑:

   //screen.h
#ifndef SCREEN_H
#define SCREEN_H

int test();
void print(char c);

#endif

还有

  //kmain.c
#include "screen.h"

int kmain(){
int b = test();
print('A');
return 0xcafebabe;
}

nm 内核.elf

    $ nm kernel.elf
e4524ffe a CHECKSUM
00000000 a FLAGS
0010011c b kernel_stack
00004000 a KERNEL_STACK_SIZE
00100000 T kmain
001000c8 T loader
001000dd t loader.loop
1badb002 a MAGIC_NUMBER
001000b0 T outb
00100072 T print
0010002c T strlen
00100068 T test
0010005c T testFunc

kmain的gdb反汇编:

    (gdb) disassemble kmain
Dump of assembler code for function kmain:
0x00100000 <kmain+0>: push %ebp
0x00100001 <kmain+1>: mov %esp,%ebp
0x00100003 <kmain+3>: sub $0x28,%esp
0x00100006 <kmain+6>: call 0x10006b <print+1> ;should call test but calls print instead
0x0010000b <kmain+11>: mov %eax,-0xc(%ebp)
0x0010000e <kmain+14>: movl $0x41,(%esp) ;pushes 'A'
0x00100015 <kmain+21>: call 0x100084 <print+26> ;calls print('A')
0x0010001a <kmain+26>: mov $0xcafebabe,%eax
0x0010001f <kmain+31>: leave
0x00100020 <kmain+32>: ret
0x00100021 <kmain+33>: nop
0x00100022 <kmain+34>: nop
0x00100023 <kmain+35>: nop
End of assembler dump.

最佳答案

0x00100006 <kmain+6>:   call   0x10006b <print+1> ;should call test but calls print instead

<print+1>只是标签。该指令确实调用 test从地址0x10006b可以看出功能:

00100068 T test
00100072 T print

如果你看看编译后的“screen.c”的反汇编就会更清楚。

关于c - ld 使我的所有函数都链接到头文件中的最后一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31854098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com