Re: Efficiently setting up large quantities of constant data
From: Dr. Adrian Wrigley (amtw_at_linuxchip.demon.co.uk.uk.uk)
Date: 12/17/04
- Next message: Dmitry A. Kazakov: "Re: APQ"
- Previous message: Dmitry A. Kazakov: "Re: Ada DB bindings and APQ"
- In reply to: Vinzent 'Gadget' Hoefler: "Re: Efficiently setting up large quantities of constant data"
- Next in thread: Alex R. Mosteo: "Re: Efficiently setting up large quantities of constant data"
- Reply: Alex R. Mosteo: "Re: Efficiently setting up large quantities of constant data"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Fri, 17 Dec 2004 13:53:43 GMT
OK I have just tried this.
I have a plain text file "NigeriaScam4.txt", which I turn into
an object file "nigeria.o", and link in. (Source below)
I encountered one or two problems:
I can't access the "..._size" value. This is an absolute value
in the object file, not the location where the value is stored.
If I try to Import the size, the program crashes at runtime,
because the size is incorrectly interpreted as the location of
the variable storing the size.
The code works, but seems a bit messy. Calculating the size
is a nuisance, and I can't "import" the Message (local type
is not constant).
Aside from these issues, the code works. The program
outputs the contents of the text file as
built into the executable.
Any ideas for:
1) Importing the value of the ..._size symbol
2) Making the contents constant
3) Tidying it up a bit
note that writing into the Message is possible, but probably
shouldn't be. (is there an option to make the data read-only?)
Of course, the Message could be copied into another value
which was constant, but that would be wasteful. Or an
access to constant value could be used.
Thanks
--
Adrian (using GNAT 3.15p on Athlon/Linux)
with Text_IO;
with System.Storage_Elements;
-- Start out with two files, this source file, and a simple
-- text file, NigeriaScam4.txt
--
-- Build executable by creating object file containing txt data
-- using objcopy. Include object file in link.
--
-- objcopy --input-target=binary --binary-architecture=i386 --output-target=elf32-i386 NigeriaScam4.txt nigeria.o
-- gnatmake demo
procedure Demo is
pragma Linker_Options ("nigeria.o");
Name : constant String := "NigeriaScam4_txt";
use System.Storage_Elements;
MessageStart, MessageEnd : Character;
pragma Import (C, MessageStart, "_binary_" & Name & "_start");
pragma Import (C, MessageEnd, "_binary_" & Name & "_end");
Message : String (1 .. Integer (MessageEnd'Address-MessageStart'Address));
for Message'Address use MessageStart'Address;
begin
Text_IO.Put_Line ("Length was : " & Integer'Image (Message'Length));
Text_IO.Put_Line ("Message was : " & Message);
end Demo;
- Next message: Dmitry A. Kazakov: "Re: APQ"
- Previous message: Dmitry A. Kazakov: "Re: Ada DB bindings and APQ"
- In reply to: Vinzent 'Gadget' Hoefler: "Re: Efficiently setting up large quantities of constant data"
- Next in thread: Alex R. Mosteo: "Re: Efficiently setting up large quantities of constant data"
- Reply: Alex R. Mosteo: "Re: Efficiently setting up large quantities of constant data"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]