【问题标题】:GNU Linker equivalent command in OS XOS X 中的 GNU Linker 等效命令
【发布时间】:2014-10-27 09:16:59
【问题描述】:

我正在阅读关于操作系统的 the following book。在第 43 页,他们使用以下命令将带注释的机器代码转换为原始机器代码文件:

$ ld -o basic.bin -Ttext 0x0 --oformat binary basic.o

在我的 MacBook Pro(运行 Mavericks)中运行该命令时,我得到:

ld: unknown option: -Ttext

我做了一些研究,发现 OS X 的链接器不允许使用脚本文件作为链接器脚本。

互联网上的其他一些帖子建议使用以下“正确”格式:

$ ld -T text 0x0 --o format binary -o basic.bin basic.o

虽然它对我也不起作用。

我也尝试通过homebrew 安装binutils,但它似乎不附带GNU 链接器。

该命令在 Ubuntu 14.04 中正确运行,但如果可能,我想继续在 OS X 中开发。

有没有办法使用 OS X 的链接器获得相同的结果,可能使用不同的标志?

更新:

我能够使用来自binutilsgobjcopy 使用以下命令生成一个bin:

$ gobjcopy -j .text -O binary basic.o basic.bin

但是我找不到一种方法来偏移代码中的标签地址,例如我可以使用 GNU ld 和 -Ttext 0x1000

我尝试使用 --set-start <hex> 没有任何运气:

$ gobjcopy -j .text --set-start 0x1000 -O binary basic.o basic.bin

【问题讨论】:

标签: macos linker ld


【解决方案1】:

我遵循相同的os-dev.pdf 指南,遇到了与您相同的问题。

问题的根源在于我们无论如何都需要编译一个交叉编译的gcc,所以解决方法就是这样做。

at OSDev 有一个很好的指南,但如果您运行的是最新版本的 OSX,我为此准备了一份具体指南on Github

这里是命令,不过请在将整面文字墙粘贴到您的计算机之前对其进行测试!在 Github 链接中,您会找到完整的解释,但由于 Stack Overflow 似乎喜欢嵌入在答案中的解决方案,所以在这里。

另外,如果您遇到任何错误,请向我报告(在此处或 Github 问题),以便我可以为其他人修复它。

brew install gmp
brew install mpfr
brew install libmpc
brew install gcc

export CC=/usr/local/bin/gcc-4.9
export LD=/usr/local/bin/gcc-4.9

export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"

mkdir /tmp/src
cd /tmp/src
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz # If the link 404's, look for a more recent version
tar xf binutils-2.24.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.24/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
make all install 2>&1 | tee make.log

cd /tmp/src
curl -O http://mirror.bbln.org/gcc/releases/gcc-4.9.1/gcc-4.9.1.tar.bz2
tar xf gcc-4.9.1.tar.bz2
mkdir gcc-build
cd gcc-build
../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers
make all-gcc 
make all-target-libgcc 
make install-gcc 
make install-target-libgcc 

您可以在/usr/local/i386elfgcc/bin找到 GNU 的 binutils 和交叉编译的 gcc

【讨论】:

  • 我必须进行一些更改才能使其正常工作:1. curl -O https://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.gz,因为链接已关闭。 2. 我必须用../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers --with-gmp=/usr/local/Cellar/gmp/6.2.0 --with-mpfr=/usr/local/Cellar/mpfr/4.1.0 --with-mpc=/usr/local/Cellar/libmpc/1.2.0 指定gmp、mpfr 和mpc 的位置。由于this,它仍然失败
【解决方案2】:

手动安装binutils 总是在我的 macOS 中抛出错误。

解决方法是使用homebrew:

brew tap nativeos/i386-elf-toolchain 
brew install i386-elf-binutils i386-elf-gcc

那么,您可以使用i386-elf-ld 命令代替ld

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2016-02-18
    相关资源
    最近更新 更多