This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: how to add segment at address 0?


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



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