Fix build and tests on non-Linux (Hurd)

Mark Wielaard mjw at redhat.com
Sat Jun 27 13:30:00 UTC 2015


On Sat, Jun 27, 2015 at 09:36:24AM +0200, Pino Toscano wrote:
> Attached there are git commits for the issues trivial hopefully enough.

Both look good. Pushed to master. Thanks.

The only problem is that we cannot guarantee not to break things
since in general elfutils targets the GNU/Linux platform. I really
need to setup a buildbot so that people can provide slaves to
automatically tests their preferred platform doesn't break.

> * Build
> 
> With the provided commits, most of sources (including tests) build 
> again.
> 
> The remaining issue is in src/strings.c, the unconditional usage of
> MAP_POPULATE. which is Linux-only. A local workaround of defining it
> to 0 if not already defined seemed to not cause further issues.

Yeah, it is slightly ugly, but it really is only a hint. So defining
it to zero if it isn't defined aleady seems fine. This is done on the
portable branch. Which I want to get rid of. So lets just do this on
master.
 
> * Tests
> 
> Most of the tests pass, and what does not are the following:
> 
> | FAIL: run-native-test.sh
> | FAIL: dwfl-bug-fd-leak
> | SKIP: run-backtrace-native.sh
> | SKIP: run-backtrace-data.sh
> | SKIP: run-backtrace-dwarf.sh
> | SKIP: run-backtrace-native-biarch.sh
> | SKIP: run-backtrace-native-core.sh
> | SKIP: run-backtrace-native-core-biarch.sh
> | SKIP: run-backtrace-core-x86_64.sh
> | SKIP: run-backtrace-core-x32.sh
> | SKIP: run-backtrace-core-i386.sh
> | SKIP: run-backtrace-core-ppc.sh
> | SKIP: run-backtrace-core-s390x.sh
> | SKIP: run-backtrace-core-s390.sh
> | SKIP: run-backtrace-core-aarch64.sh
> | FAIL: run-deleted.sh
> | SKIP: vdsosyms
> 
> The skipped tests look correct though.

For the core file tests maybe we really need an eu-core utility to
generate a core file instead of relying on the kernel to generate one.

> Let's analyze the failing tests:
> 
> | FAIL: run-native-test.sh
> | ========================
> |
> | SRCDIR/tests/allregs: dwfl_module_register_names: no error
> 
> allregs relies on the kernel modules handling, which is non-functional
> since there are no "kernel modules" on the Hurd (microkernel with
> userspace servers).

I don't think that is true. It seems run-native-tests.sh tests against
user space with -e (for an executable file test) and -p (for a running
process test), but not against kernel modules (-k or -K).

> I get a clearer error message about this with:
> 
> diff --git a/tests/allregs.c b/tests/allregs.c
> index 901d4e8..d3d459e 100644
> --- a/tests/allregs.c
> +++ b/tests/allregs.c
> @@ -158,6 +158,8 @@ main (int argc, char **argv)
>    Dwfl_Module *mod = NULL;
>    if (dwfl_getmodules (dwfl, &first_module, &mod, 0) < 0)
>      error (EXIT_FAILURE, 0, "dwfl_getmodules: %s", dwfl_errmsg (-1));
> +  if (mod == NULL)
> +    error (EXIT_FAILURE, 0, "dwfl_getmodules: module not found");
>  
>    if (remaining == argc)
>      {

Better to see first if dwfl_errno () == 0. It it is non-zero we do want
to print the actual error reported.

> Also, if I comment out the usage of allregs from run-native-test.sh,
> the test passes.
> 
> | FAIL: dwfl-bug-fd-leak
> | ======================
> |
> | (empty)
> 
> This test actually crashes on Hurd, as the dwfl_addrmodule() at
> dwfl-bug-fd-leak.c:68 returns null. This is most probably due to our
> procfs emulation not showing yet filenames in /proc/$pid/maps files.
> At least the patch below avoids the segfault of the test, still leaving
> the failure:
> 
> diff --git a/tests/dwfl-bug-fd-leak.c b/tests/dwfl-bug-fd-leak.c
> index 170a61a..f992b7a 100644
> --- a/tests/dwfl-bug-fd-leak.c
> +++ b/tests/dwfl-bug-fd-leak.c
> @@ -65,7 +65,10 @@ elfutils_open (pid_t pid, Dwarf_Addr address)
>      }
>    else
>      {
> -      Elf *elf = dwfl_module_getelf (dwfl_addrmodule (dwfl, address), 
> &bias);
> +      Dwfl_Module *module = dwfl_addrmodule (dwfl, address);
> +      if (module == NULL)
> +       error (2, 0, "dwfl_addrmodule: no module available for 0x%llx", 
> address);
> +      Elf *elf = dwfl_module_getelf (module, &bias);
>        if (elf == NULL)
>         error (2, 0, "dwfl_module_getelf: %s", dwfl_errmsg (-1));
>      }

That looks like the correct check to me.
 
> | FAIL: run-deleted.sh
> | ====================
> |
> | SRCDIR/src/stack: dwfl_linux_proc_attach pid 1491: Function not 
> implemented
> 
> This is because dwfl_linux_proc_attach is implemented only on Linux,
> returning ENOSYS everywhere else. I made the test skipped with the 
> following:
> 
> diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh
> index 790b4f4..bb306c0 100644
> --- a/tests/backtrace-subr.sh
> +++ b/tests/backtrace-subr.sh
> @@ -74,6 +74,10 @@ check_unsupported()
>      echo >&2 $testname: arch not supported
>      exit 77
>    fi
> +  if grep -q -E ': dwfl_linux_proc_attach pid ([[:digit:]]+): Function 
> not implemented$' $err; then
> +    echo >&2 $testname: OS not supported
> +    exit 77
> +  fi
>  }
>  
>  check_native_unsupported()
> 
> but I'm not sure that would be the correct way (especially that it
> relies on the string representation of ENOSYS).

It isn't really correct to do it that way, but we do already depend on
the string representation of some error messages in some other tests.
Lets just use it here too.

Better would of course be to implement the support. Doesn't the hurd
support ptrace?

Thanks,

Mark


More information about the elfutils-devel mailing list