Globales Symbol auf 0 setzen

17/06/2014 - 11:13 von ole-usenet-spam | Report spam
Hallo,

ich habe ein àlteres Programm (IRAF [1]; Fortran/C/eigener Ratfor-Dialekt),
das ich gerne ein wenig portabler gestalten möchte.

Eins der dabei auftretenden Probleme ist, dass der (Fortran-)
Common-Block "mem_" auf Null gesetzt werden möchte. Derzeit wird das in
einem kleinen Stück Assemblercode gemacht [2]:

8<--
# The following has nothing to do with ZSVJMP, and is included here
# only because this assembler module is loaded with every process.
# This code sets the value of the symbol MEM (the VOS or Fortran Mem
# common) to zero, setting the origin for IRAF pointers to zero
# rather than some arbitrary value, and ensuring that the MEM common
# is aligned for all datatypes as well as page aligned. A further
# advantage is that references to NULL pointers are likely to cause a
# memory violation.

.globl _mem_
_mem_ = 0
8<--

Kann man das irgendwie portabel gestalten? So dass es auch unter MacOSX
(und anderen Unix-Alikes: BSD, Hurd) und under nicht-x86-Prozessoren
funktioniert?

(Die Antwort auf die Frage, wie man den Rest von zsvjmp.s portabel
gestalten kann, gibt tausend Bonusponkte :-) ich bin da aber sehr
pessimistisch, dass die jemand einheimst).

Ole

[1] http://iraf.noao.edu/
[2] https://github.com/joequant/iraf/bl...4/zsvjmp.s
 

Lesen sie die antworten

#1 Stefan Reuther
17/06/2014 - 19:46 | Warnen spam
Оlе Ѕtrеісhеr wrote:
Eins der dabei auftretenden Probleme ist, dass der (Fortran-)
Common-Block "mem_" auf Null gesetzt werden möchte. Derzeit wird das in
einem kleinen Stück Assemblercode gemacht [2]:



Was wird denn mit dem 'Common-Block "mem_"' angestellt? Der Kommentar...

8<--
# The following has nothing to do with ZSVJMP, and is included here
# only because this assembler module is loaded with every process.
# This code sets the value of the symbol MEM (the VOS or Fortran Mem
# common) to zero, setting the origin for IRAF pointers to zero
# rather than some arbitrary value, [...]



...liest sich so, als ob das als Basisadresse für ein Array benutzt
wird, in das mit Pointern indexiert wird. Da kann man auch gleich die
Pointer direkt verwenden.

Kann man das irgendwie portabel gestalten? So dass es auch unter MacOSX
(und anderen Unix-Alikes: BSD, Hurd) und under nicht-x86-Prozessoren
funktioniert?



Praktisch bekommst du ein Symbol, das die Adresse 0 hat, auch, indem du
es als weak-Symbol deklarierst und nirgends definierst. Das müsste jeder
Compiler können, der ELF kann ('#pragma weak SYMBOL'). Ob da MacOSX
dabei ist, weiß ich nicht, aber auf diversen nicht-x86-Prozessoren gibt
es das auf jeden Fall.


Stefan

Ähnliche fragen