This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: how to add segment at address 0?
- From: Vladimir Kondratiev <vladimir dot kondratiev at intel dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: binutils at sources dot redhat dot com
- Date: Wed, 05 Feb 2003 00:03:44 +0200
- Subject: Re: how to add segment at address 0?
- References: <m3n0lbkgzt.fsf@workshop.nickc.cambridge.redhat.com>
Nick,
sorry for stupid question regarding where to put .note.ABI-tag section.
Following quite simple fragment do work.
The only excuse for me is that after 16 hours of debug it's hard to
concentrate.
[]$ cat zero_data.c
int z_i=123;
[]$ cat main.c
#include <stdio.h>
extern int z_i;
int main(int argc, char* argv[])
{
printf("zero segment: z_i=%d at %p\n",z_i,&z_i);
return 0;
}
[]$ ./zero
zero segment: z_i=123 at (nil)
Vladimir.
PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
data_zero PT_LOAD ;
dynamic PT_DYNAMIC ;
note PT_NOTE ;
}
SECTIONS
{
. = 0;
.data_at_zero : { zero_data.o(.data) } :data_zero
/* Read-only sections, merged into text segment: */
. = 0x08048000 + SIZEOF_HEADERS;
.interp : { *(.interp) } :text :interp
.note.ABI-tag : { *(.note*) } :text :note
.hash : { *(.hash) } :text
Nick Clifton wrote:
Hi Vladimir,
> I need to allocate some data at address 0. Otherwise, it is ordinal
> "C" program. All I need is one section starting at address 0.
>
> I tried to tweak LD script to add one more segment. Here I faced with
> problem:
>
> I printed "default" LD script using "--verbose" flag and started to
> modify it. But, since I need to add segment, I need to use PHDRS. LD
> "default" script have no PHDRS directive. On myself, I did not
> succeeded to write proper PHDRS and set up sections to use proper
> segments.
>
> How should I do it? Let's say, I need to write "C" program where
> section ".zero_based" will start at address 0.
The linker manual can tell you all you need to know.
However you may find the following example helpful.
% cat data.c
int data_at_zero = 1;
% cat text.c
int data_not_at_zero = 2;
extern int data_at_zero;
int main (void) { data_not_at_zero = data_at_zero; return 0; }
% gcc data.c text.c -Wl,-T -Wl,zero.ld
% objdump -h a.out | head
a.out: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .data_at_zero 00000004 00000000 00000000 00001000 2**2
CONTENTS, ALLOC, LOAD, DATA
1 .interp 00000013 080480f4 080480f4 000000f4 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.ABI-tag 00000020 08048108 08048108 00000108 2**2
I have attached zero.ld which was made from the default linker script
and adding a section like this:
. = 0; .data_at_zero : { data.o(.data) } :data_zero
and a set of PHDRS like this:
PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
data_zero PT_LOAD ;
dynamic PT_DYNAMIC ;
}
Cheers
Nick