Specifying symbol names under which binary values are added

Mitar mmitar@gmail.com
Mon Mar 13 00:50:00 GMT 2017


Hi!

Thanks! Fixing that, and removing ".align 4" for end address made it
work. (I align the size, afterwards.)


Mitar

On Sun, Mar 12, 2017 at 4:41 PM, Cary Coutant <ccoutant@gmail.com> wrote:
>> Thanks for the suggestion. I am trying for now to make it compatible
>> data-wise with the output from before, only symbol names should be
>> different. I made:
>>
>> .section images
>> .global _binary_image_jpg_start
>> .type _binary_image_jpg_start, @object
>> .align 4
>> _binary_image_jpg_start:
>> .incbin "/long/path/to/image.jpg"
>> .global _binary_image_jpg_end
>> .type _binary_image_jpg_end, @object
>> .align 4
>> _binary_image_jpg_end:
>> .global _binary_image_jpg_size
>> .type _binary_image_jpg_size, @object
>> .align 4
>> _binary_image_jpg_size:
>> .int _binary_image_jpg_end - _binary_image_jpg_start
>>
>> And I assemble it with "as image.as -o image.o". But something does
>> not work. Resolving symbols in my other code and accessing data
>> returns me garbage now. Or at least something decoder fails to parse.
>> Is there anything more to do?
>
> You need an "a" flag on the .section directive:
>
>     .section images, "a"
>
> Without it, the linker places the section in the output object file as
> unloadable data (like debug info), and your running program has no
> access to it.
>
> To replicate the way the linker creates the _size symbol, you need to
> declare the symbol as an absolute symbol, rather than a label on a
> word in memory. Note the difference between this:
>
>     .global _binary_image_jpg_size
>     .type _binary_image_jpg_size, @object
>     .align 4
>     _binary_image_jpg_size:
>     .int _binary_image_jpg_end - _binary_image_jpg_start
>
> and this:
>
>     .global _binary_image_jpg_size
>     _binary_image_jpg_size = _binary_image_jpg_end - _binary_image_jpg_start
>
> In the former case, the size has been added as an additional 4 bytes
> at the end of your images section, and you would access it like this:
>
>     extern int _binary_image_jpg_size;
>     ...
>     printf ("Size = %d\n", _binary_image_jpg_size);
>
> In the latter case, it's an absolute symbol whose value itself is the
> size (the images section contains only the jpg contents), and you
> access it like this:
>
>     extern char _binary_image_jpg_size;
>     ...
>     printf ("Size = %d\n", &_binary_image_jpg_size);
>
> (Even though we're using the & operator, we're not really getting the
> *address* of anything -- we're simply getting the value of the symbol.
> Usually, the value of a symbol is an address, so C's & operator is
> called "address-of", but this is an exception.)
>
> -cary



-- 
http://mitar.tnode.com/
https://twitter.com/mitar_m



More information about the Binutils mailing list