what is the logic of populate?

ng@piments.com ng@piments.com
Sat Jun 6 06:46:00 GMT 2009


Hi,

first of all, thanks for the reply. It seems much of the problem was me 
tripping myself up having started to build a clean source dir and then 
confusing the two.

Now I'll reply to a couple of points where I think ct-ng could be made 
easier to understand and note things that have caused me some confusion.



Yann E. MORIN wrote:
> Hello!
> 
> On Sunday 31 May 2009 15:27:10 ng@piments.com wrote:
>> arm-unknown-linux-gnueabi-populate -v -f -s root -d root-image
> 
> Why do you need to use '-f' at all?

Basically because it fails to create destdir if I don't. This way I 
don't need to check and conditionally do a mkdir myself.

Is there a good reason why this is not the default behaviour?

When I first ran populate is returned silently. I took this to be a 
successful execution , in fact it had done nothing.

You explain that this is one of the sanity checks. But if it fails a 
sanity check and aborts, it would seem best to indicate that it 
terminated without doing what was requested and to state what the 
problem was.

It seems curious that it will happily rm -rf destdir without warning but 
  drops out if it needs to do a mkdir. If anything, I would expect the 
opposite: -f being needed to authorise scrapping an existing structure.

At least the mkdir would seem safe to do without the -f switch.

> 
>> it created a very sleek and light root-image/lib but failed to find 
>> libwrap and hence failed to copy it.
>> #ls /back/ts/root2/usr/lib/libwrap*
> 
> Your command line is using "root" as the source dir, but you have
> libwrap in "root2". Maybe that's the reason...
> 
>> In looking further I found it had copied /var/spool/cron/crotab but NOT 
>> that actual crontab files therein. So I have not cron tasks defined.
> 
> Same root vs. root2 mismatch?
> 
>> bash-4.0#ls -l /back/ts/root2/sbin/init
>> -rwxr-xr-x 1 root root 31211 2009-05-22 22:39 /back/ts/root2/sbin/init
>> bash-4.0#ls -l /back/ts/root-image/sbin/init
>> lrwxrwxrwx 1 root root 14 2009-05-31 13:38 /back/ts/root-image/sbin/init 
>> -> ../bin/busybox
>> So it has replaced the REAL sysvinit with a symlink to busybox !? No 
>> wonder it won't boot. What is going on here?
> 
> populate is not supposed to do that, indeed.
> root vs. root2 mismatch, again?
> 
>> In order for populate to determine the required libs , it must have all 
>> programs (such as init) in place in the source tree. If it is then going 
>> to ignore the installed progs and arbitrarily create symlinks to other 
>> executables it's seems difficult to have confidence in the result.
> 
> populate does not do that. Look at the code, it's quite straightforward.
> 
> 1) some sanity checks:
>    - dest and source are specified
>    - source exists
>    - unless forced, dest does not exist
>    - source != dest
> 
> 2) copy source to dest
> 
> 3) add forced libraries to dest
>    - build the list from -l and -L options
>    - get forced libraries from sysroot (see below for heuristics)
> 
> 4) add all missing libraries
>    - scan dest for every ELF files that are 'executables' or 'shared object'
>    - list the "NEEDED Shared library" fields
>      - check if the library is already in dest/lib or dest/usr/lib
>      - if not, get the library from sysroot
>        - if it's in sysroot/lib, copy it to dest/lib
>        - if it's in sysroot/usr/lib, copy it to dest/usr/lib
>        - in both cases, use the SONAME of the library to create the file
>          in dest
>        - if it was not found in the sysroot, this is an error.
> 
> That's all. No symlinking, no file-name mangling (besides using the SONAME), 
> no file removal...
> 
> Maybe we could add some other paths to check for, eg. usr/local/lib...
> 

Yes this may be a good idea.

>> Apparently I do not understand the exact function of populate. This may 
>> be due in part to the very brief usage help that appears to be the only 
>> documentation.
> 
> What do you think of the above? If it makes things clear, then I'll
> add that to the doc.
> 
> I'm using it, and it does work. The only gotcha you may encounter is if
> you are using a non-english locale, as I forgot to force LC_ALL and LANG
> before I run readelf, and that may imply missing the NEEDED fileds...
> Will fix that.
> 
>> Is this information available anywhere?
> 
> I though that docs/overview.txt and the help text were enough. Moreover,
> the code is quite simple, and (hopefuly) well commented... Apparently,
> that was not enough...

overview.txt is a good overview but I found it lacked detail I needed to 
know. Adding something like the four point summary you gave above would 
be very helpful.

I'm not a fan of doc==src . If I find I have to start ploughing through 
source code to find out how a tool works I'd generally look for another 
tool or do the job by hand.



One final point about overview.txt, I found the description of the 
arguments confusing. Now I know what it does it makes sense. When I was 
reading this find out what it did it was confusing.

 >>
When your root directory is ready, it is still missing some important 
bits: the toolchain's libraries. To populate your root directory with 
those libs, just run:
   your-target-tuple-populate -s /your/root -d /your/root-populated
 >>

Confusion: "to populate your root" does not mean populate /your/root

In fact you never populate "your root" directory as it is called here, 
and it is never used as an image of the root as you describe it. The 
following changes to that text may make it easier to understand for 
those who do not already know how populate works:

c?/your/root?/your/root-tmp?g

c/To populate your root directory with/To create a copy of your 
temporary root directory and populate it with/


I hope these comments are useful. Thanks once again for your help.

regards, Peter.



> 
> Regards,
> Yann E. MORIN.
> 


--
For unsubscribe information see http://sourceware.org/lists.html#faq



More information about the crossgcc mailing list