Page MenuHomeFreeBSD

installworld: handle ldd including preloaded objects
ClosedPublic

Authored by emaste on Apr 1 2022, 2:04 PM.
Tags
None
Referenced Files
Unknown Object (File)
Thu, Nov 7, 3:52 PM
Unknown Object (File)
Sat, Nov 2, 5:53 PM
Unknown Object (File)
Sat, Nov 2, 5:53 PM
Unknown Object (File)
Sat, Nov 2, 5:53 PM
Unknown Object (File)
Sat, Nov 2, 5:53 PM
Unknown Object (File)
Sat, Nov 2, 5:40 PM
Unknown Object (File)
Fri, Nov 1, 6:23 AM
Unknown Object (File)
Sun, Oct 20, 4:02 PM

Details

Summary
The installworld target makes a temporary copy of binaries to be used
during the install.  Libraries that they depend on are also included,
found by using `ldd`.

After commit 0913953c9ed0 ldd started listing preloaded objects,
including [vdso], under a [preloaded] header.  Stop parsing ldd output
once we reach the preloaded section.

Diff Detail

Lint
Lint Skipped
Unit
Tests Skipped

Event Timeline

emaste requested review of this revision.Apr 1 2022, 2:04 PM
emaste created this revision.

Referenced commit 0913953c9ed0

cy added a subscriber: cy.

Works

This revision is now accepted and ready to land.Apr 1 2022, 2:13 PM

I missed the sort -u, [preloaded] is the first line of output

sort and unique library list after parsing

Still no good since we pass all $progs to one ldd invocation

just skip over [preloaded] and [vdso]

I see that.

Either:

1.multiple invocations of ldd (not preferred), or

  1. ignore everything between "[preloaded]" and the next line that contains /^\//, or
  2. simply ignore lines that begin with / or [ using awk

IMO options 1 & 2 are klunky. Option 3 is better but still inelegant, without overcomplicating it.

I can put printing of the preloaded objects under the option/env var, but I did not wanted to do that.

This revision is now accepted and ready to land.Apr 1 2022, 3:04 PM

Further to my previous comment, I'm thinking:

libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | \
    awk '$$1 !~ /:$$/ && $$1 !~ /^\[.*\]/ {print}' | sort -u | \
    while read line; do \
        set -- $$line; \
        if [ "$$2 $$3" != "not found" ]; then \
                echo $$2; \
        else \
                echo "Required library $$1 not found." >&2; \
                exit 1; \
        fi; \
    done); \

Or as a diff:

diff --git a/Makefile.inc1 b/Makefile.inc1
index 04c44d8e297b..2be0980e503d 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -1366,7 +1366,8 @@ distributeworld installworld stageworld: _installcheck_world .PHONY
                fi; \
            done); \
        if [ -z "${CROSSBUILD_HOST}" ] ; then \
-           libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \
+         libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | \
+             awk '$$1 !~ /:$$/ && $$1 !~ /^\[.*\]/ {print}' | sort -u | \
                    while read line; do \
                        set -- $$line; \
                        if [ "$$2 $$3" != "not found" ]; then \
kevans added inline comments.
Makefile.inc1
1369

|| -> -o for test(1)

use a case statement to skip everything enclosed in square brackets

This revision now requires review to proceed.Apr 1 2022, 3:55 PM

The case construct is probably the most elegant solution.

This revision is now accepted and ready to land.Apr 1 2022, 4:01 PM

This vdso thing happens when building releng/12.3 as well. Edit: I suppose it will happen on any older builds but this branch is at least still supported.