雖然prelink(8)
工具和概念被廣泛厭惡(也可能不是隨你的發行版),你可以用它來庫鏈接到二進制到低內存:
-r --reloc-only=ADDRESS
Instead of prelinking, just relink given shared libraries
to the specified base address.
由於該庫將被映射到進程的地址是由ld(1)
確定,你也許可以修改Makefile
調用ld
與不同--section-start
值:
--section-start SECTION=ADDRESS
Set address of named section
-Tbss ADDRESS Set address of .bss section
-Tdata ADDRESS Set address of .data section
-Ttext ADDRESS Set address of .text section
-Ttext-segment ADDRESS Set address of text segment
我感動的文字和BSS段下降到低位地址:
$ gcc -Wl,-Ttext-segment=0x200000 -Wl,-Tbss=0x400000 -o broken broken.c
$ readelf -a broken
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x200450
...
如果你可以移動與--section-start
可執行文件所提供的所有部分和移動圖書館下來prelink(8)
,您可能可以將所有代碼加載到4千兆字節以下。基於您的評論
有什麼特別的原因嗎? – Gabe 2011-03-22 07:58:33
如果我可能會問 - 爲什麼你不想訪問整個64位地址空間? – paulcam 2011-03-22 08:09:00
@Gabe:我正在使用llvm jit並強制它在64位進程中生成x86代碼。當我爲「printf」指令生成代碼時,它將調用libc中的函數;但寄存器的大小變爲32位,我無法到達地址(libc地址在7fffxxxxxxxx中。) – 2011-03-22 08:16:08