Отв.: Shared library link
Till Straumann
strauman at slac.stanford.edu
Mon Sep 26 20:00:19 UTC 2011
I didn't follow this thread closely and maybe I'm a bit off-topic
but I just wanted to mention that I use my own variant of a run-time
linker and symbol-table tool (web-page probably doesn't have the
latest version):
http://www.slac.stanford.edu/~strauman/rtems/cexp/index.html
It has been in use for many years now at some major research
facilities (particle accelerators).
FWIW
-- Till
On 09/26/2011 12:22 PM, Cudmore, Alan P. (GSFC-5820) wrote:
> The base image is built just like a standard RTEMS binary with the
> "Init" function. In my base image, I do some basic initialization, then
> I initialize and run the shell startup script. The base image uses the
> BSP linker script, which already locates it in an absolute location in
> memory. You may need to adjust the base image linker script to allow for
> some room to locate your applications.
> The shell startup script will mount the eeprom/flash file system, then
> load and execute the first loadable binary image.
> The loader can be a program that parses the elf file and copies the code
> and data to ram ( and clears the BSS ).
>
> The loadable binary files are linked with a rule similar to this:
>
> APP1_ADDRESS = 0x01730000
> APP1_ENTRYPT = APP1_AppMain
>
> app1.elf: rtems.elf app1.o
> $(LINKER) $(APP_LD_FLAGS) -Rrtems.elf -Ttext $(APP1_ADDRESS)
> -e$(APP1_ENTRYPT) -o app1.elf app1.o
>
> Note that you do not need to link in any libs, because they should be in
> the base rtems.elf image.
>
> You have to carefully manage the memory map where you locate each task.
> If one of them grows it will overlap the next task's space.
>
> I also failed to mention the CEXP solution earlier:
> http://www.slac.stanford.edu/%7Estrauman/rtems/cexp/index.html
> This loader has worked well for me. I could not use it on my current
> application due to memory constraints.
>
> So that all being said, I would still rather use a dynamic loader.
> Micro-managing the memory map and trying to determine what needs to be
> re-linked is a pain!
>
> Alan
>
>
> On Sep 26, 2011, at 8:58 AM, Oleg Moroz wrote:
>
>> Can you send me scripts to build base image with absolute memory
>> addresses?
>>
>> ------------------------------------------------------------------------
>> *From:* "Cudmore, Alan P. (GSFC-5820)" <alan.p.cudmore at nasa.gov
>> <mailto:alan.p.cudmore at nasa.gov>>
>> *To:* Oleg Moroz <oleg_moroz at yahoo.com <mailto:oleg_moroz at yahoo.com>>
>> *Cc:* Rtems <rtems-users at rtems.org <mailto:rtems-users at rtems.org>>
>> *Sent:* Monday, September 26, 2011 4:47 PM
>> *Subject:* Re: Отв.: Shared library link
>>
>> I have a current RTEMS application that uses your method of
>> separate binary image for each task.
>>
>> Our application was developed under vxWorks which has a dynamic
>> object loader. On RTEMS, I build a base "kernel image" that
>> includes the BSP, startup code, network stack, and any functions
>> that I need from the C or Math libraries.
>>
>> Each application ( which is one or more RTEMS tasks ) is linked to
>> an absolute memory location ( as you describe with your
>> segmentation below ). Each task binary sets it's base address
>> using the -T link option, it sets it's entry point using the -e
>> link option, then it resolves it's external references by using
>> the -R option to refer to the base image.
>>
>> We developed a "static loader" which loads the binary file from a
>> file system at runtime, and returns the application entry point.
>> The base image/startup code can then create the RTEMS task to
>> start the application.
>>
>> This all works very well, but it does have drawbacks:
>> 1. You must include any functions that your application needs into
>> your base image. This can be done by a reference to a symbol.
>> 2. If anything changes in the base image, you must re-link and
>> re-load all of your applications or they will crash.
>>
>> We intend to replace this in the future with the dynamic loader
>> that Chris has mentioned.
>>
>> Alan
>>
>>
>> On Sep 26, 2011, at 3:05 AM, Oleg Moroz wrote:
>>
>>> Thanks for answer. Sorry for my english.
>>>
>>> >What happens when the size of the code changes ?
>>>
>>> I'm developing my application with memory "segmentation". I mean:
>>>
>>> 0x40000000
>>> --------------
>>> main task
>>> --------------
>>>
>>> 0x40001000 (for example)
>>> -------------
>>> second task
>>> -------------
>>>
>>> 0x40002000
>>> -------------
>>> third task
>>> -------------
>>>
>>> 0x4000f000
>>> ------------
>>> functions like printf() and other common functions and data
>>> ------------
>>>
>>>
>>> 0x40001000-0x40000000 > sizeof(main task)
>>> 0x40002000-0x40001000 > sizeof(second task)
>>> ......
>>>
>>> I mean what i must manually locate all of this tasks in memory,
>>> and allocate memory "segment" for every task. It will be doing by
>>> main task that could load task code from EEPROM. I'm trying to
>>> create mechanism to dynamicallyloading and unloading tasks like
>>> it did in usual OSes with processes. This mechanism need not be
>>> universally. It only for this project now.
>>>
>>> >I suggest you take a look at:
>>> >
>>> >http://www.rtems.org/ftp/pub/rtems/people/chrisj/rtl/
>>>
>>> Thanks. Now i'm downloading archive from this directory, and will
>>> see what is it.
>>>
>>>
>>> >In the traditional definition dynamic and static libraries are
>>> not the same type of code. They can varying depending on the
>>> specific method used by the operating system. As Joel stated
>>> RTEMS is a single address space or processes and will not support
>>> the Unix
>>> >(ELF) shared library model. It adds overhead for no gain. Given
>>> this I am not sure I understand your sentence. For example have
>>> you built shared RTEMS libraries (the tools will let you do this)
>>> and static libraries and are you attempting to mix the results ?
>>>
>>> I will try.
>>>
>>> ------------------------------------------------------------------------
>>> *From:* Chris Johns <chrisj at rtems.org <mailto:chrisj at rtems.org>>
>>> *To:* Oleg Moroz <oleg_moroz at yahoo.com
>>> <mailto:oleg_moroz at yahoo.com>>
>>> *Cc:* Rtems <rtems-users at rtems.org
>>> <mailto:rtems-users at rtems.org>>
>>> *Sent:* Monday, September 26, 2011 2:48 AM
>>> *Subject:* Re: Отв.: Shared library link
>>>
>>> On 24/09/11 4:01 PM, Oleg Moroz wrote:
>>> > Okay. The reason why i want extract functions from shared or
>>> static
>>> > library is dynamical achange parts of code.
>>>
>>> In the traditional definition dynamic and static libraries
>>> are not the same type of code. They can varying depending on
>>> the specific method used by the operating system. As Joel
>>> stated RTEMS is a single address space or processes and will
>>> not support the Unix (ELF) shared library model. It adds
>>> overhead for no gain. Given this I am not sure I understand
>>> your sentence. For example have you built shared RTEMS
>>> libraries (the tools will let you do this) and static
>>> libraries and are you attempting to mix the results ?
>>>
>>> > Now i have small app than
>>> > can parse elf file and extract machine code of ever Task (or
>>> another
>>> > functions).
>>>
>>> I suggest you take a look at:
>>>
>>> http://www.rtems.org/ftp/pub/rtems/people/chrisj/rtl/
>>>
>>> I have a host based linker in development. I thought I had a
>>> copy on the server but I do not. I will upload a version soon.
>>>
>>> The path I have taken to create a runtime link editor in
>>> RTEMS that can load ELF relocatable object files directly or
>>> from archive files and resolve any external symbols as well
>>> as export any suitable symbols. This is all via the dlopen
>>> call. I have an RTEMS linker in development which handles the
>>> dependence resolution providing a suitable meta-data format.
>>> This project is still in development.
>>>
>>> Note, this RTEMS project uses waf so check the README.
>>>
>>> > Problem is what the addresses of all functions in the
>>> > recompiled project (with some bug fixes or functionality
>>> added) are not
>>> > the same with original project.
>>>
>>> The object files are relocatable. You need a link editor to
>>> locate the object files and fix up the addresses.
>>>
>>> > I must fix it manually, but this is the
>>> > easiest way to make an error. I think than i can create the
>>> library with
>>> > all functions. and addresses of that funcs are constant.
>>>
>>> What happens when the size of the code changes ?
>>>
>>> > after this i
>>> > could link it with my extracted updated task. extract task
>>> again,
>>> > and overwrite it on working RTEMS. Maybe linker or compiler
>>> has some
>>> > command switch? Something like - Ttext=0x40100000
>>>
>>> Sorry, but I do not understand this.
>>>
>>> Chris
>>>
>>>
>>> _______________________________________________
>>> rtems-users mailing list
>>> rtems-users at rtems.org <mailto:rtems-users at rtems.org>
>>> http://www.rtems.org/mailman/listinfo/rtems-users
>>
>>
>>
>> _______________________________________________
>> rtems-users mailing list
>> rtems-users at rtems.org <mailto:rtems-users at rtems.org>
>> http://www.rtems.org/mailman/listinfo/rtems-users
>
>
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users
More information about the users
mailing list