首页
学习
活动
专区
工具
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.3K20
  • 关于编译重要概念总结

    接下来开发者实现了包括核心 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多个年头。

    94620

    【技术干货】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编译会工程设置为准,即便改了也无济于事。

    99710

    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格式表头信息来进行初始化 在操作系统中,地址空间初始化通常是由操作系统内核来完成

    16310

    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.4K30

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

    ) 汇编(Assembling)链接(Linking)我们一个名为helloc语言源文件为例:图片图片我们也可以直接编译,语法格式如下: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.5K10

    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.5K20

    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

    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变量便是当前内核源代码目录。

    2K20

    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

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

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

    4.8K20

    快速上手和使用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

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

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

    85630

    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.2K20

    100个Linux命令(6)-软件管理 rpm 和 yum

    使用编译器(如 gcc)将源码(c 文件和 h 文件)编译成目标文件 o 文件; 在编译过程中,使用 makefile 文件中配置选项进行编译。...在 Linux 上使用 ld 工具,将 o 文件和所需库文件链接起来组成一个可正常工作可执行程序。链接了库文件之后可可以发起一些系统调用。...注意:不要对内核升级,多版本内核可以共存,因此可以执行安装内核操作。...只替换为主版本号,如 Redhat7.5,则替换为7 $arch 系统架构 $basearch 系统基本架构,如 i386等 $YUM0-9 在系统定义环境变量,可以在 yum 中使用 系统发行商在系统中放置...make命令会根据Makefile文件进行编译。编译工作主要是调用编译器(如gcc)将源码编译为可执行文件,通常需要一些函数库才能产生一个完整可执行文件。

    2.2K30

    论文复现前奏篇:漫漫长路之Caffe-C3D

    2.2 转换数据集格式2.3 训练及测试3.Caffe-C3D3.1 下载及配置3.2 安装库与编译4.C3D-cifar10测试4.1 获取数据集4.2 转换数据集格式4.3 训练及测试 0.导语 终于复活了...GCC与G++降级 使用是Ubuntu18.04系统,该系统默认装gcc为7.3,而cuda支持版本是6.0以下,所以我们需要降级,这里选择版本为gcc5.5。...安装gcc5: sudo apt-get install gcc-5 g++-5 降级方法: sudo mv gcc gcc.bak sudo ln -s gcc-5 gcc sudo mv g++...将python环境更换为anaconda3环境: ANACONDA_HOME := $(HOME)/anaconda3 PYTHON_INCLUDE := $(ANACONDA_HOME)/include...解决: (1)编辑bashrc sudo vim ~/.bashrc (2)尾部添加: export LD_LIBRARY_PATH="/usr/local/cuda/lib64" export LD_LIBRARY_PATH

    1.2K10
    领券