2014-09-03 133 views
3

我在閱讀有關操作系統的the following book。在第43頁,他們使用下面的命令來標註的機器代碼轉換成原始機器代碼文件:OS X中的GNU Linker等價命令

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

當我的MacBook Pro運行命令(運行小牛隊),我得到:

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的鏈接器相同的結果,可能具有不同的標誌?

UPDATE:

我能夠生成以下命令斌,使用gobjcopybinutils

$ 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 
+0

查看MacPorts版本,您可能會發現[可用選擇](http://www.macports.org/ports.php?by=name&substr=binutils)更多運氣。 – 2014-09-03 01:28:50

+0

我不認爲gnu binutils ld支持osx。請參閱http://stackoverflow.com/questions/1608009/how-to-install-gnu-ld-on-mac-os-x-10-6和http://www.quora.com/How-do-I -get-GNU-ld-on-OS-X – 2014-09-03 04:17:12

+0

有沒有辦法在不使用GNU ld specific的特性的情況下獲得相同的結果? – jviotti 2014-09-03 12:15:52

回答

4

我下面同樣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 

你會發現GNU的binutils的,並在/usr/local/i386elfgcc/bin

0

您的交叉編譯GCC通過選項-image_base上,你可以對生成的二進制設置的起始內存地址的LD。