Storing "Stuff" in an executable

Several programs store things inside of an executable. I.E.

  • usage messaeg
  • photon widget definitions
  • debug information

Is there a utility that I can use to store data of my own choosing
inside of an executable?

If so, how would the running program access that data?
Could the same utility be used to display (assuming it’s text data) and
modify that data?

I’m looking for something very similar to a usage mesasge, but readable
by the program itself like the widget definitions.

Does all of this ancelary data get loaded when the executable is loaded
into memory?

Try “objcopy --addsection section=filename”. This will add a section with
‘filename’ contents.

cheers,

Kris

“Bill Caroselli” <qtps@earthlink.net> wrote in message
news:b30m0m$sh1$2@inn.qnx.com

Several programs store things inside of an executable. I.E.

  • usage messaeg
  • photon widget definitions
  • debug information

Is there a utility that I can use to store data of my own choosing
inside of an executable?

If so, how would the running program access that data?
Could the same utility be used to display (assuming it’s text data) and
modify that data?

I’m looking for something very similar to a usage mesasge, but readable
by the program itself like the widget definitions.

Does all of this ancelary data get loaded when the executable is loaded
into memory?

Kris Warkentin <kewarken@qnx.com> wrote:

Try “objcopy --addsection section=filename”. This will add a section with
‘filename’ contents.

How does the running program access this data?

“Bill Caroselli” <qtps@earthlink.net> wrote in message
news:b30pnh$564$1@inn.qnx.com

Kris Warkentin <> kewarken@qnx.com> > wrote:
Try “objcopy --addsection section=filename”. This will add a section
with
‘filename’ contents.

How does the running program access this data?

objcopy will allow you to add sections, and objdump will read them back.
objcopy and objdump are part of the GNU binutils so you can look at the src
for more info. QNX usage info is in a section called QNX_usage. PhAB info is
in QNX_PhAB, etc. This info doesn’t get loaded, any more than debug info
does (though with appropriate manipulation of the ELF program header and
section table, anything’s possible). To get an idea of what’s in there:

objdump -x /usr/photon/bin/ped

It’s a very small amount of work to programatically open the executable,
read the section header table, and load the section. (if you choose to code
it directly rather than invoke the utility or use the GNU lib).

  • Eric

kabe@sra-tohoku.co.jp wrote:

qtps@earthlink.net > sed in <b30pnh$564$> 1@inn.qnx.com> >:

How does the running program access this data?

Depends whether you want to read it in-memory or from file.
These are just top-of-the-head suggestions:

from file:
Use libelf to get the section contents.
Hmm there’s no libelf manual; /usr/lib/libelf.a exists
but not supported?

from memory:
add the section as loadable data region
(–set-section-flags =load ? dunno)

but where should I get the address of it?
Something may could be done by hacking objdump/ld/whatever, but
seems like making a simple asm file and assemble-link
should be easier.

This is proving to be very educational. I’m learning more than I
wanted to know about ELF format files. But information never goes
to waste.

Thanks to all who replied.

qtps@earthlink.net sed in <b30pnh$564$1@inn.qnx.com>:

How does the running program access this data?

Depends whether you want to read it in-memory or from file.
These are just top-of-the-head suggestions:

from file:
Use libelf to get the section contents.
Hmm there’s no libelf manual; /usr/lib/libelf.a exists
but not supported?

from memory:
add the section as loadable data region
(–set-section-flags =load ? dunno)

but where should I get the address of it?
Something may could be done by hacking objdump/ld/whatever, but
seems like making a simple asm file and assemble-link
should be easier.

kabe

Hello, Bill!

I have article about that problem … but it is in russian :slight_smile:
http://qnx.org.ru/docs-devel/elf.html

In two words: you can read .ELF segments without any library, as base I’m
using print_usage function by Colin Burgess for QNX6. It is in attachment -
use.c. Also here my example how to use .ELF data directly from code.
sections.c and usgcol.h .

But be careful, QNX6 loads up all ELF file into memory, so those overlays in
…elf segments will eat your memory. Here complete archive of sources for my
article ftp://ftp.qnx.org.ru/pub/projects/mike/files.tar.gz .

Good luck :wink:

With best regards, Mike Gorchak. E-mail: mike@malva.ua


begin 666 use.c
M+RH@0V]D92!B>2!#;VQI;B!"=7)G97-S(#QC8G5R9V5S<T!Q;G@N8V]M/BP@
MB-“B\J(&9I<G-T(’!U8FQI<VAE9#H@-”!$96,@,C P,“X@(” @(" @(" @
M(" @("HO#0H-"B-I9F1E9B!?7U5304=%#0HE0R M(‘1E<W0@<’)I;G1?=7-A
M9V4-"B-E;F1I9B O
B!?7U5304=%(“HO#0H-“B-I;F-L=61E(#QE<G)N;RYH
M/@T*(VEN8VQU9&4@/&9C;G1L+F@^#0HC:6YC;‘5D92 <W1D:6\N:#X-"B-I
M;F-L=61E(#QS=&1L:6(N:#X-"B-I;F-L=61E(#QS>7,O9&5B=6<N:#X-“B-I
M;F-L=61E(#QS>7,O96QF+F@^#0HC:6YC;'5D92 <WES+W!R;V-F<RYH/@T*
M(VEN8VQU9&4@/‘5N:7-T9"YH/@T*#0IV;VED(’!R:6YT7W5S86=E*‘9O:60I
M#0I[#0I%;&8S,E]%:&1R"0EE:&1R.PT16QF,S)?4VAD<@D)G-H9’(@/2!.
M54Q,.PT
8VAA<@D)"2IU<V%G92 ]($Y53$PL("IS:’-T<G1A8B ]($Y53$P[
M#0II;G0)“0D)9F0L(&D[#0H-@DO
B!G970@82!F:6QE(&1E<V-R:7!T;W(@
M=&@;W5R(&5X96-U=&%B;&4@B-"@EI9B H(“TQ(#T](“AF9” ](%]C;61F
M9”@I
2 I#0H)“7)E='5R;CL-”@T*"2\J(’)E860@16QF($AE861E<B J+PT*
M"6EF(”@@<VEZ96]F*&5H9’(I(”$](’)E860H9F0L(“9E:&1R+”!S:7IE;V8H
M96AD<BDI(“D@>PT*“0ER971U<FX[#0H)?0T*#0H)+RH@0VAE8VL@14Q&(&UA
M9VEC(“HO#0H):68@" @(&5H9’(N95]I9&5N=%LP72 A/2 P>#=F( T"0E
M?”!E:&1R+F5?:61E;G1;,5T@(3T@)T4G#0H)“7Q(&5H9’(N95]I9&5N=%LR
M72 A/2 G3”<-”@D)?'P@96AD<BYE7VED96YT6S-=(”$](”=&)R I(‘L-"@D)
M<F5T=7)N.PT*“7T-”@T*"2\J(’)E860@<V5C=&EO;B!T86)L92 J+PT*“6EF
M(”@@’-H9’(@/2!M86QL;V,H(&5H9’(N95]S:&5N=’-I>F4@B!E:&1R+F5?
M<VAN=6T@2D@/3T@3E5,3" I('L-"@D)9V]T;R!E;F0#0H)?0T*“6EF(”@@
M+3$@/3T@;’-E96LH(&9D+"!E:&1R+F5?<VAO9F8L(%-%14M?4T54(“D@0T
M"0EG;W1O(&5N9#L-”@EI9B H("!E:&1R+F5?<VAE;G1S:7IE(“H@96AD<BYE
M7W-H;G5M(”$
E860H(&9D+"!S:&1R+"!E:&1R+F5?<VAE;G1S:7IE("H@
M96AD<BYE7W-H;G5M(“D@0T"0EG;W1O(&5N9#L-”@T
"2\J(’)E860@<W1R
M:6YG(&EN9&5X("HO#0H):68@
" H<VAS=’)T86(@/2!M86QL;V,H(’-H9’);
M96AD<BYE7W-H<W1R;F1X72YS:%]S:7IE(“DI(#T]($Y53$P@2![#0H)"6=O
M=&@96YD.PT
"7T-”@EI9B H("TQ(#T](&QS965K
"!F9"P@<VAD<EME:&1R
M+F5?<VAS=’)N9’A=+G-H7V]F9G-E=“P@4T5%2U]3150@2 I#0H)"6=O=&@
M96YD.PT
"6EF(”@@<VAD<EME:&1R+F5?<VAS=’)N9’A=+G-H7W-I>F4@(3T@
M<F5A9"@@9F0L(’-H<W1R=&%B+"!S:&1R6V5H9’(N95]S:’-T%TN<VA?
M<VEZ92 I(“D@>PT*“0EG;W1O(&5N9#L-”@E]#0H-@DOB!L;V]K(‘1H<F]U
M9V@@96%C:"!S96-T:6]N(‘5N=&EL(’=E(&9I;F0@=&AE(")13EA?=7-A9V4B
M(’-E8W1I;VX@B-"@EF;W(@"!I(#T@,3L@:2 (&5H9’(N95]S:&YU;3L@
M:2LK("D@>PT
"0EI9B H("%S=’)C;7 H(“9S:’-T<G1A8EMS:&1R6VE=+G-H
M7VYA;65=+”)13EA?=7-A9V4B2D-"@D)"6)R96%K.PT"7T-"@EI9B H(&D@
M/3T@96AD<BYE7W-H;G5M(“D-”@D)9V]T;R!E;F0[#0H-"@EI9B H(“AU<V%G
M92 ](&UA;&QO8R@@<VAD<EMI72YS:%]S:7IE(“DI(#T]($Y53$P@0T"0EG
M;W1O(&5N9#L-”@T*“6EF(”@@+3$@/3T@;’-E96LH(&9D+”!S:&1R6VE=+G-H
M7V]F9G-E=“P@4T5%2U]3150@2 I#0H)"6=O=&@96YD.PT#0H):68@"!S
M:&1R6VE=+G-H7W-I>F4@(3T@<F5A9"@@9F0L('5S86=E+"!S:&1R6VE=+G-H
M7W-I>F4@2 I#0H)"6=O=&@96YD.PT#0H)=W)I=&4H(%-41$524E]&24Q%
M3D\L('5S86=E+"!S:&1R6VE=+G-H7W-I>F4@3L-"@T96YD.@T
"6EF(”@@
M<VAD<B I#0H)“69R964H(’-H9’(@*3L-”@EI9B H(’-H<W1R=&%B(“D-”@D)
M9G)E92@@<VAS=’)T86(@3L-"@EI9B H('5S86=E(“D-”@D)9G)E92@@=7-A
M9V4@3L-“GT-”@T:6YT(&UA:6XH=F]I9"D-“GL-”@EP<FEN=%]U<V%G92@I
6.PT
#0H)<F5T=7)N(# [#0I]#0H-"@``
`
end

begin 666 sections.c
M(VEN8VQU9&4@/’-T9&EO+F@^"@HC:6YC;'5D92 B=7-G8V]L+F@B"@IC;VYS
M="!C:&%R('5S86=E6UT@7U]A='1R:6)U=&5?7R@H<V5C=&EO;B@B44Y87W5S
M86=E(BDI2 ]( H@(" B7&XE0R M($%P<&QI8V%T:6]N(&9O<B!T97-T:6YG
M('5S86=E(&-O;&]R<SI<;EQN(@H@(" B(" @1&%R:R!C;VQO<G,Z(%QN(@H@
M(" B(" @(" @(B!54T=?0DQ512 @(" @(" B0FQU95QN(@H@(" B(" @(" @
M(B!54T=?1U)%14X@(" @(" B1W)E96Y<;B(
(" @(B @(" @("(@55-'7T-9
M04X@(" @(" @(D-Y86Y<;B((" @(B @(" @("(@55-'7U)%1" @(" @(" @
M(E)E9%QN(@H@(" B(" @(" @(B!54T=?34%'14Y402 @(" B36%G96YT85QN
M(@H@(" B(" @(" @(B!54T=?0E)/5TX@(" @(" B0G)O=VY<;B(
(" @(B @
M(" @("(@55-'7TQ)1TA41U)!62 @(DQI9VAT($=R87E<;B((" @(EQN(@H@
M(" B(" @3&EG:'0@8V]L;W)S.B!<;B(
(" @(B @(" @("(@55-‘7T1!4DM’
M4D%9(" @(D1A<FL@1W)A>5QN(@H@(" B(" @(" @(B!54T=?3$E’2%1"3%5%
M(" B3&EG:'0@0FQU95QN(@H@(" B(" @(" @(B!54T=?3$E’2%1’4D5%3B B
M3&EG:'0@1W)E96Y<;B((" @(B @(" @("(@55-'7TQ)1TA40UE!3B @(DQI
M9VAT($-Y86Y<;B(
(" @(B @(" @("(@55-‘7TQ)1TA44D5$(" @(DQI9VAT
M(%)E9%QN(@H@(" B(" @(" @(B!54T=?4$E.2R @(" @(" B4&EN:UQN(@H@
M(" B(" @(" @(B!54T=?645,3$]7(" @(" B665L;&]W7&XB"B @("(@(" @
M(" B(%531U]72$E412 @(" @(")7:&ET95QN(@H*(" @55-‘7TQ)1TA41U)!
M62 B7&XB.R O+R!R971U<FX@9&5F875L="!C;VQO<G,"F-O;G-T(&-H87(@
M:6YF;UM=(%]?871T<FEB=71E7U\H
’-E8W1I;VXH(E%.6%]I;F9O(BDI2 ]
M"B)35$%413U%>’!E<FEM96YT86Q<;B(
(DE.4U1!3$Q$25(]>#@V+W5S<B]B
M:6XO7&XB"B))3E-404Q,3D%-13US96-T:6]N<W1E<W1<;B((DY!344]<V5C
M=&EO;G-<;B(
(E5315(]<F]O=%QN(@HB2$]35#UD969L96MT;W)<;B((D1!
M5$4],C P,B\P."\R,2TQ-SHU-3HP,45%4U1<;B(
(D1%4T-225!424]./4IU
M<W0@82!S96=M96YT<R!T97-T(’!R;V=R86TN7&XB.PH*:6YT(&UA:6XH*0I[
M"B @(&-H87(@8G5F9F5R6S(U-ET["@H@("!P<FEN=&8H(EQN(BD[“B @( H@
J(”!S8V%N9B@B)7,B+"!B=69F97(I.PH@(" (" @<F5T=7)N(# ["GT
`
end

begin 666 usgcol.h
M(VEF;F1E9B!?7U531T-/3%](7U*(V1E9FEN92!?7U531T-/3%](7U*“B-D
M969I;F4@55-'7T),04-+(” @(" @(EQX,4(B(ELR,CLS,&TB"B-D969I;F4@
M55-'7T),544@(" @(" @(EQX,4(B(ELR,CLS-&TB"B-D969I;F4@55-'7T=2
M145.(" @(" @(EQX,4(B(ELR,CLS,FTB"B-D969I;F4@55-'7T-904X@(" @
M(" @(EQX,4(B(ELR,CLS-FTB"B-D969I;F4@55-'7U)%1" @(" @(" @(EQX
M,4(B(ELR,CLS,6TB"B-D969I;F4@55-'7TU!1T5.5$$@(" @(EQX,4(B(ELR
M,CLS-6TB"B-D969I;F4@55-‘7T)23U=.(" @(" @(EQX,4(B(ELR,CLS,VTB
M"B-D969I;F4@55-‘7TQ)1TA41U)!62 @(EQX,4(B(ELR,CLS-VTB"@HC9&5F
M:6YE(%531U]$05)+1U)!62 @(")<>#%"(B);,3LS,&TB"B-D969I;F4@55-’
M7TQ)1TA40DQ512 @(EQX,4(B(ELQ.S,T;2((V1E9FEN92!54T=?3$E’2%1’
M4D5%3B B7’@Q0B(B6S$[,S)M(@HC9&5F:6YE(%531U],24=(5$-904X@(")<
M>#%"(B);,3LS-FTB"B-D969I;F4@55-'7TQ)1TA44D5$(" @(EQX,4(B(ELQ
M.S,Q;2(
(V1E9FEN92!54T=?4$E.2R @(" @(" B7’@Q0B(B6S$[,S5M(@HC
M9&5F:6YE(%531U]914Q,3U<@(" @(")<>#%"(B);,3LS,VTB"B-D969I;F4@
M55-'7U=(251%(" @(" @(EQX,4(B(ELQ.S,W;2(*"B-E;F1I9B O+R!?7U53
)1T-/3%](7U*
`
end