Hi

On Wed, Nov 27, 2013 at 10:31 PM, Greg KH <gre...@linuxfoundation.org> wrote:
> On Wed, Nov 27, 2013 at 07:48:39PM +0100, David Herrmann wrote:
>> In several situations we want to link a binary file into our executable
>> and access it from our C code. The easiest way is to transform it into a
>> C-array and compile it as usual. However, for large files (>1MB) such
>> compilations can take a considerable amount of time or even fail on
>> low-memory systems.
>>
>> This adds a new automake-target to link binary sources directly. Instead
>> of transforming it into a C-array, we simply use "ld -r" to create an
>> object file via:
>>   ld -r -o my-source.bin.o --format=binary my-source.bin
>> We also use "-z noexecstack" to mark "my-source.bin.o" to not require an
>> executable stack.
>>
>> As we only want to support read-only data sources here, we do some
>> post-processing to mark the object as read-only via:
>>   objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents 
>> my-source.bin.o
>>
>> As libtool requires "*.lo" files, we cannot link this object-file
>> directly. Thus, we also create a fake "*.lo" file for such objects which
>> libtool can use. Note that libtool actually *requires* the comment-section
>> in "*.lo" files (ugh?!) so we need to fake that, too.
>>
>> How to use this helper?
>>  - put your binary source file into the tree as:
>>      src/somewhere/something.bin
>>  - for the library you want to link that to, add this to mylib_LIBADD:
>>      src/somewhere/something.bin.lo
>> This causes the helper to create src/somewhere/something.bin.[o,lo] and
>> it will be linked as a normal object file.
>>
>> GNU-ld automatically creates 3 symbols for such objects, but the important
>> symbols are:
>>   extern const char _binary_src_somewhere_something_bin_start[];
>>   extern const char _binary_src_somewhere_something_bin_end[];
>> Use these to access start/end of the binary section.
>>
>> I tested this with in-tree and out-of-tree builds, with GNU-ld and
>> GNU-gold and cross-compilation. All worked fine..
>
> That's crazy, very nice job in doing this :)
>
> I tried to do this a while ago, and gave up and just used a perl script
> and a .c file with a big array, like 'xxd -i' can create.  I think I'll
> "steal" this idea for other projects if you don't mind, as it makes
> things easier just to use the linker.

I figured that out about 1 year ago, took me way too long to get working.
Please, go ahead and copy it! And if any issue comes up, let me know.

Thanks
David
_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to