如何使用最近(使用PIC啓用)gcc創建不可重定位符號? 我基本上要具備以下C程序打印NULL:如何創建不可重定位的符號
#include <stdio.h>
extern int mem_;
int main(void) {
printf("%p\n", &mem_);
return 0;
}
我想什麼是一個小的彙編文件:
.data
.globl mem_
.type mem_,@object
.set mem_, 0
但是這創造了一個重新定位的符號,它在運行時不具備值爲0.
背景:我試圖讓一箇舊的程序運行,它使用這個技巧以一個數組的形式從Fortran直接訪問(分配)內存。由於該程序具有»10 5 LOC,因此重寫所有內容都是不可行的。
[編輯] GNU彙編手冊documents an "absolute section"作爲
絕對段:本節始終是「搬遷」到運行地址0。這是有用的,如果你想引用一個地址的地址0搬遷時ld不得改變。從這個意義上說,我們所說的絕對地址是「不可重新定位的」:它們在重定位期間不會改變。
這可能是我在這裏需要的(對吧?),但我找不到啓用此部分的方法。 .struct
指令是documented to switch to the "absolute section";然而,下面的彙編程序無法正常工作或:
.globl mem_
.struct 0
mem_:
的符號出現在這種情況下*ABS*
與objdump
:
$ objdump -t memc
memc: file format elf64-x86-64
[...]
0000000000000540 g F .text 000000000000002b _start
0000000000201030 g .bss 0000000000000000 __bss_start
000000000000064a g F .text 000000000000003c main
0000000000000000 g *ABS* 0000000000000000 mem_
[...]
,但它仍然是搬遷。
使用['-fno-pie -no-pie']製作一個依賴於位置的可執行文件會不會很容易*(https://stackoverflow.com/questions/43367427/32-bit-絕對地址,不再視爲允許合的x86-64 Linux的)? –
如果這是一個Fortran程序,爲什麼標記爲C而不是Fortran?如果你想從C傳遞數組到Fortran,爲什麼不通過'NULL'? – fuz
Fortran只是問題背後的基本原理,但問題與其無關。基本上,我想通過NULL,但問題是如何做到這一點。只是'mem_ = NULL'不起作用,因爲它將符號的值設置爲NULL,而不是符號本身。 – olebole