This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

need help with section attributes & relocation


I am running a SunOS-hosted cross development environment for MIPS 
that I built successfully a while ago. Now I am trying to write some 
small tests that need to locate code in kseg1 (0xa000000), and I have 
tried innumerable approaches to actually getting a section of code 
located there with the proper attributes. I am tired of fighting with 
the linker command language, so this seems like a good time to ask 
for help.

1) If I make a up a private name for this section, it only has the 
attribute READONLY. Is there some way to assign the attributes of a 
section either in gas or in the linker command language? I searched 
through the info files but can't find anything. It would be really 
nice if you could do something like:

.kseg1 0xa0000000 : LOAD ALLOC READONLY CODE
{ *(.kseg1) }

But, of course this causes a parse error. Is there some other syntax 
for it? Or, perhaps in the assembler, something analogous to:

.section .kseg1 (LOAD ALLOC READONLY CODE)

How does one assign attributes to a section? Or is this not possible?

2) An alternative is to just let it be .text, which will give it the 
proper attributes, but then I can't force the linker to put it where 
I want it. Suppose I put all the contents for this section in one 
file called ks1.o; there are other .text sections that go in the 
"normal" place in other files. Then I can have a section directive 
like:

.kseg1 0xa0000000: { ks1.o(.text) }

If I put this before the other text directive (that collects the 
non-kseg1 code), and restore the load point to its normal place 
(0x400080) before the rest of the text, I get a "no room for program 
headers" message. If I place it afterwards, it ends up being empty 
because the *(.text) in the normal .text section directive sucks up 
all the sections, including this one.

I also tried using the MEMORY facility, but it seems to do absolutely 
nothing. In other words, I defined a memory region that starts at 
0xa0000000 and had a more normal section directive:

.kseg1 : { ks1.o(.text) } > kseg1

This is completely ignored; the symbol in ks1.o's .text section ends 
up in the normal .text output section (yes, this directive came 
first) despite it being redirected to the specific memory section.

It seems like the idea of selecting one section from one file and 
putting it in one place, then taking all the similarly-named 
sections from other files and putting them somewhere else falls apart 
if the first one selected goes at a higher address than the others. 

Any suggestions on how to get around this problem?

-Ken

Kenneth F. Greenberg, President
California Advanced Software Tools, Inc.
Los Gatos, CA, USA
http://www.calast.com/ken