首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我想在Makefile中将'ld‘替换为'gcc’以链接我的内核对象

Makefile 中将链接器从 ld 替换为 gcc 是一个常见的需求,特别是在构建内核或其他复杂项目时。使用 gcc 作为链接器可以自动处理一些编译器特定的选项和库。

以下是一个示例,展示如何在 Makefile 中将 ld 替换为 gcc 以链接内核对象。

示例 Makefile

假设你有一个简单的 Makefile,原本使用 ld 进行链接:

代码语言:javascript
复制
# 原始 Makefile
OBJS = main.o kernel.o

all: kernel

kernel: $(OBJS)
    ld -o kernel $(OBJS)

%.o: %.c
    gcc -c $< -o $@

clean:
    rm -f *.o kernel

我们将其修改为使用 gcc 进行链接:

代码语言:javascript
复制
# 修改后的 Makefile
OBJS = main.o kernel.o
LDFLAGS = -nostdlib -T linker.ld

all: kernel

kernel: $(OBJS)
    gcc $(LDFLAGS) -o kernel $(OBJS)

%.o: %.c
    gcc -c $< -o $@

clean:
    rm -f *.o kernel

解释

  1. 定义对象文件
    • OBJS = main.o kernel.o 定义了需要链接的对象文件。
  2. 链接目标
    • 原始链接命令:ld -o kernel $(OBJS)
    • 修改后的链接命令:gcc $(LDFLAGS) -o kernel $(OBJS)
    • 使用 gcc 进行链接,并通过 LDFLAGS 传递链接器选项。
  3. 编译规则
    • %.o: %.c 规则用于编译 .c 文件为 .o 文件。
    • gcc -c $< -o $@ 使用 gcc 进行编译。
  4. 清理目标
    • clean 目标用于删除生成的文件。

链接器选项

在使用 gcc 作为链接器时,通常需要传递一些特定的链接器选项。以下是一些常见的选项:

  • -nostdlib:不使用标准库。
  • -T linker.ld:指定链接脚本文件。

你可以根据需要添加或修改这些选项。

完整示例

以下是一个更完整的示例,假设你有一个链接脚本 linker.ld

代码语言:javascript
复制
# Makefile
OBJS = main.o kernel.o
LDFLAGS = -nostdlib -T linker.ld

all: kernel

kernel: $(OBJS)
    gcc $(LDFLAGS) -o kernel $(OBJS)

%.o: %.c
    gcc -c $< -o $@

clean:
    rm -f *.o kernel

链接脚本 linker.ld

假设你的链接脚本 linker.ld 内容如下:

代码语言:javascript
复制
/* linker.ld */
SECTIONS
{
    . = 0x100000;

    .text : {
        *(.text)
    }

    .data : {
        *(.data)
    }

    .bss : {
        *(.bss)
    }
}

运行 Makefile

在命令行中运行 make 命令:

代码语言:javascript
复制
make

这将编译和链接你的内核对象文件,生成最终的 kernel 可执行文件。

通过这种方式,你可以在 Makefile 中将 ld 替换为 gcc 以链接内核对象文件,并根据需要传递特定的链接器选项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Makefile常用模板「建议收藏」

大家好,又见面了,我是你们的朋友全栈君。 做开发的特别是C/C++开发者一般都会用到Makefile,然而多数时候在公司做项目都不需要自己去写Makefile,仅仅停留在能看懂的基础上。...单文件项目 其实一个文件的项目也没必要写Makefile了,哈哈。便于理解就先从最基础的开始吧,Makefile实际上就是写有gcc等编译链接语句的脚本,加上一些可以缩写这些语句的规则。...# 方便起见一般都会先定义编译器链接器 CC = gcc LD = gcc # 正则表达式表示目录下所有.c文件,相当于:SRCS = main.c a.c b.c SRCS = $(wildcard...*.c) # OBJS表示SRCS中把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o OBJS = $(patsubst %c, %o, $(SRCS)) # 可执行文件的名字...-f $(OBJS) $(TARGET) 多个文件,多个程序 这个用的比较少,网上的资料更少,当年我费了老大劲最终才找到这个方法。

1.4K20
  • 关于编译的重要概念总结

    接下来开发者实现了包括核心的 gcc 和 glibc。但是 GNU 系统缺少操作系统内核。原定的内核叫 HURD,一直完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。...汇编文件变成可执行的二进制文件:hello.s变成hello.o ld(链接器):GNU Linker,loader。...将函数库中相应的代码组合到目标文件中,汇编文件和系统库文件链接起来,生成在特定平台可执行的程序。 最早的操作系统中,是没有链接器的,由加载器loader进行工作,所以ld的命名由此而来。...对于 .c和.cpp文件,g++则统一当做cpp文件编译 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL gcc在编译C文件时,可使用的预定义宏是比较少的...C++语言版本 C++是一门以C为基础发展而来的一门面向对象的高级程序设计语言,从1983年由Bjarne Stroustrup教授在贝尔实验室创立开始至今,已有30多个年头。

    96220

    【技术干货】GD32VF103C-START 入门

    一、序言 近期从创易栈中很荣幸获得了一块GD32VF103C-START 开发板,是基于RISC-V内核的32位通用微控制器,从这个网站我初步了解了这个芯片的特性,大家可以上网看看,内核是使用芯来科技Bumblebee...内核(RV32IMAC),指令集是开源的,不用许可,这个和arm是有区别的,因此,我认为可以降低成本了,毕竟没有了arm的许可费用。...我这里以芯来科技https://www.nucleisys.com/的NucleiStudio_IDE_202008来进行测试。修改版本如下。...而原本的名字是riscv-none-embed-gcc,那么编译就会出现找不到gcc而编译失败。 另外这个选项也会更新makefile文件。...不要手动修改makefile文件,因为eclipse编译会以工程设置为准,即便改了也无济于事。

    1.1K10

    Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)

    静态库是编译后的程序代码集合,包含一组函数或其他对象文件,可以在链接时与可执行文件一起使用。...1.3动态库制作和使用 形成.o文件与生成共享库 上面我讲解了,静态库的制作和使用,我们在形成.o文件时,都是使用gcc -c code.c ==> code.o。...这里的.so代表“shared object”,即共享对象 为了创建一个名为libmyc.so的共享库,使用如下的命令: gcc -shared -fPIC -o libmyc.so *.o 使用makefile...使用 符号可以获取环境变量的值,而不是直接使用变量名。因此,LD_LIBRARY_PATH 将会被替换为 LD_LIBRARY_PATH 环境变量的当前值。...地址空间既然是一个数据结构对象,谁来用什么数据初始化呢?——使用ELF格式的表头信息来进行初始化 在操作系统中,地址空间的初始化通常是由操作系统内核来完成的。

    21610

    c语言内联函数和动态链接库的制作和使用

    今天继续给大家分享c语言里面的内联函数的使用以及动态链接库的制作和使用;内联函数的使用,在很多交流群里面,看到有网友经常问到这一块(这个在Linux内核代码里面经常能够看到这种写法,平常的代码里面我一般很少看到这种用法...动态链接库的制作和使用 1.动态链接库的制作: 在我们gcc编译环境下默认使用的就是动态链接库的,今天我们来自己制作动态链接库。...hello\n"); } 然后把这个函数的原型写到hell.h文件当中去: void fun1(void); 然后同样也是在当前目录下写一个Makefile文件来记录生成静态链接库的过程,这个文件里面写...2.动态链接库的使用: 上面创建好了静态链接库,现在我们就来使用这个静态链接库,然后我在当前目录下再创建一个目录叫做testlib,然后把hell.h和libhell.so移到这个目录下面,同时在这个目录下面创建一个...# gcc test.c -o test -lhell /usr/bin/ld: 找不到 -lhell collect2: error: ld returned 1 exit status 我们还是要使用

    1.5K30

    Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

    ) 汇编(Assembling)链接(Linking)我们以一个名为hello的c语言源文件为例:图片图片我们也可以直接编译,语法格式如下:gcc [编译⽂件] -o [⽬标⽂件]例如:gcc test.c...:这个阶段需要 GCC 调用链接器对程序需要调用的库进行链接,最终得到一个可执行的二进制文件图片多文件编译格式1:多文件同时编译gcc 1.c 2.c 3.c –o test$....libxxx.so在 Windows 中动态库一般以 lib 作为前缀,以 dll 作为后缀,中间是库的名字需要自己指定,即: libxxx.dll生成动态链接库是直接使用 gcc 命令并且需要添加 -...那么动态链接器是如何搜索某一个动态库的呢,在它内部有一个默认的搜索顺序,按照优先级从高到低的顺序分别是:可执行文件内部的 DT_RPATH 段系统的环境变量 LD_LIBRARY_PATH系统动态库的缓存文件...Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    1.6K10

    i.MX6ULL嵌入式Linux开发4-根文件系统构建

    但我此次测试时,修改Makefile后,输入make指令的命令进行编译时,不指定编译器,还是会提示编译器找不到之类的问题。所以,此次的测试,我就没有修改这个Makefile。.../lib/ -d 后面的“-d”表示拷贝符号链接,这里有个比较特殊的库文件:ld-linux-armhf.so.3,此库文件也是个符号链接,相当于 Windows 下的快捷方式。...会链接到库 ld-2.19-2014.08-1-git.so 上,输入命令如下指令查看此文件详细信息: ls ld-linux-armhf.so.3 -l ?...但是,ld-linux-armhf.so.3不能作为符号链接,否则的话在根文件系统中执行程序无法执行!所以我们需要重新复制ld-linux- armhf.so.3,替换掉这个软链接。... :客户端IP ,开发板的IP地址,Linux内核启动以后就会使用此IP地址来配置开发板。我的为92.168.5.102。

    1.1K50

    用GCC开发STM32,正点原子开发板的一个库函数版本例程示例

    GCC环境搭建. 首先下载交叉编译环境GCC,这个网上有很多,百度一下就能找到下载。比如 Sourcery G++ for ARM EABI 我的CSDN资源里,有相关下载。...以下是简要学习Makefile的笔记: 1. %.a: 匹配所有以.a结尾的所有文件名    |--> 类似于通常意义的*. 2....gcc库一般以lib(name).a来命名库文件,使用    -l参数导入库文件的时候,直接使用-lname来引入,lib被省略.   ...下面是编译 正点原子 stm32f103开发板的一个库函数版本的流水灯的例程的makefile,需要注意几点得是: 要把startup_stm32f10x_hd.s替换为gcc_ride7里面的startup_stm32f10x_hd.s...要找能用于gcc下面的链接脚本根据需要修改。CSDN资源里有完整的编译通过的例子。

    1.6K20

    makefile使用.lds链接脚本以及 常用命令 解析

    1.2 制作Makefile objs := head.o init.o nand.o main.o nand.bin : $(objs)   arm-linux-ld -Tnand.lds...$@  目标文件 $^  所有的依赖文件 $<   第一个依赖文件   例如: arm-linux-ld -Tnand.lds -o nand_elf $^ > arm-linux-ld...这里就需要将多个目标文件的.text、.data和.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段 .text: 代码段,存放程序执行代码的一块内存 .data: 读/写数据段...先说明以下makefile中一些变量意义: (1)KERNELRELEASE在linux内核源代码中的顶层makefile中有定义 (2)shell pwd会取得当前工作路径 (3)shell uname...-r会取得当前内核的版本号 (4)LINUX_KERNEL_PATH变量便是当前内核的源代码目录。

    2.1K20

    busybox引导linux内核_linux移植教程

    ->Get BusyBox ->Download Source 2.1 修改顶层Makefile 进入Makefile vim Makefile 找到CROSS_COMPILE和ARCH,并进行修改...选中unicode编码,以支持中文选中unicode编码,以支持中文 Location: -> Settings -> Support Unicode //选中...lib目录下 备注1:“-d”表示拷贝符号链接,有个比较特殊的库文件: ld-linux-armhf.so.3,此库文件是个符号链接,相当于 Windows 下的快捷方式。...备注2:rootfs/lib目录中的d-linux-armhf.so.3是一个软连接,没用,所以先删除在将源文件拷贝进去 cd /usr/local/arm/gcc-linaro-4.9.4-2017.01....3 cp ld-linux-armhf.so.3 /home/lsy/tools/lsy/nfs/rootfs/lib/ 拷贝{交叉编译工具链安装目录}/lib目录中的库文件到到{rootfs}/lib

    5.4K30

    快速上手和使用makefile

    有一次我问老师,为什么要傅里叶变换,学习它能用来做什么,老师先是很惊讶,然后耐心的给所有同学都讲了讲,老师讲完也很欣慰,笑着说因为很少有学生去问这样的问题。所以也只是讲课,没讲实际的应用和原理的东西。...makefile是什么?为什么要用makefile?简单的说makefile就是编译程序用的,因为用makefile效率高。...GCC开发 stm32的例子,没有用启动文件start.s 如我有以下几个文件:isr.c,uart_helloworld.c,有链接脚本文件stm32f103VET6.ld 文件内容:isr.c,...bbs用的是外部时钟25M while (1) { } } 链接脚本文件stm32f103VET6.ld ,定义代码段和内存变量等的存储位置。...arm-elf-gcc -g -mcpu=cortex-m3 -mthumb -c isr.c -nostartfiles -o isr.o 链接: arm-elf-ld -T stm32f103vet6

    1.4K20

    linux动态库和静态库的使用_静态库的使用

    在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。...而gcc/g++编译器默认都是动态链接的,若想进行静态链接,可以携带一个-static选项。...,我就不做过多的阐述了。...因为我们使用gcc编译的是C语言,而gcc就是用来编译C程序的,所以gcc编译的时候默认就找的是C库,但此时我们要链接的是哪一个库编译器是不知道的,因此我们还是需要使用-l选项,指明需要链接库文件路径下的哪一个库...如果不加-fPIC选项,则加载.so文件的代码段时,代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的拷贝,并且每个拷贝都不一样

    4.8K20

    STM32高级开发——链接器与启动文件

    链接器 链接的过程 首先,想要明白链接器的工作原理我们还是要来深入的看看整个编译过程中具体的方式和原理。 我想大家都知道高级语言出现之前我们所用的汇编语言是除机器码外最接近硬件的语言。...链接器就是用来做这个工作的,当然不只是gcc的链接器,世上所有c程序的编译工具链应该都是以这种理念设计的。。...工具链中链接器的用法 在实际中,链接器的执行程序实际上是arm-none-eabi-ld这个文件,但是我再实际的编写过程中在遇到.c和.cpp文件混合的工程中,ld会在链接过程中报错。...而对此官方的说明是推荐使用arm-none-eabi-gcc指令来链接工程,它会自动的调用ld程序且不会出现上面这种情况,所以接下来我们都是以arm-none-eabi-gcc指令来介绍链接器工作的。...细心的同学可能已经注意到了,我们之前提到过,这些变量的定义实际上都来自于ld文件中,他们在ld文件中被定义,最后链接器会将他们转换为实际的地址给我们的程序所使用的。

    95630

    【Linux】掌握库的艺术:我的动静态库封装之旅

    也就是说,这个动态库的名字就是c,没错这就是c运行库。 1.2.2 静态库 静态库是将一组对象文件(.o 文件)打包成一个库文件(通常为 .a 后缀),在编译时将其链接到最终生成的可执行文件中。...如果我要实现位置无关码可以在gcc后面加上-fPIC选项 gcc -fPIC -c add.c gcc -fPIC -c sub.c 我们也知道不加-fPIC一样可以生成.o文件。...如果不加-fPIC选项,则加载.so文件的代码时,代码段引用的数据对象需要重定位,这个重定位会修改代码段地内容,这就会造成每一个使用这个.so文件代码段的内核里都会生成这个.so文件代码的拷贝,并且每一个拷贝都不一样...这些文件被包含在/etc/ld.so.conf文件中,ldconfig命令会在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索可共享的动态链接库...c:创建一个新的库,如果库文件不存在。 s:创建索引,以加快链接过程。 t:列出库中包含的文件。 x:从库中提取指定的文件。 d:从库中删除指定的文件。

    8410

    Linux软件安装管理之--源码包安装

    gcc 编译器进行程序编译流程图: ? C 语言的原始代码文件通常以 *.c 作为扩展名,在编译的过程当中还会产生所谓的目标文件(object file),这些文件以 *.o  的扩展名存在。...(Link)以产生正确的执行文件。...、依赖软件等,并建立 makefile 文件; 4)make 编译:make 程序使用 makefile 作为参数配置文件,编译成为可执行文件; 5)make install 安装:make 以 makefile...,搜索出可共享的动态链接库(格式如lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。...动态函式库的扩展名为 *.so 而静态则是 *.a ; 可以利用 ldconfig 与 /etc/ld.so.conf  /etc/ld.so.conf.d/*.conf 来制作动态函式库的链接与快取。

    3.3K51

    QT5.6移植到ARM三星4412-

    它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。  ...Qt完全面向对象、且模块化程度更高,易与扩展,并且允许真正组件编程。此外,Qt支持更多的平台与丰富的API,支持2D/3D 图形渲染、OpenGL、大量的开发文档、XML等等。...由于Qt每一版本的发布都历经了各式平台各类配置的反复测试,这便对其背后的相 应支持基础设施要求极高。此次Qt5.6便应用到了其新持续集成系统以极大节省系统及CPU时间; n 高分辨率支持。...1.2 移植 1.2.1 源码下载链接 官网下载链接:http://download.qt.io/archive/qt/ 图1-1 最新版本5.6 图1-2 选择单一的压缩包 图1-3 选择linux...内容如下: #QT相关的路径 export QTDIR=/qt5.6_lib #设置共享库路径 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib #键盘

    7.3K20
    领券