public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
@ 2021-07-01 21:00 Ludovic Courtès
  2022-10-06 14:55 ` Carlos O'Donell
  0 siblings, 1 reply; 5+ messages in thread
From: Ludovic Courtès @ 2021-07-01 21:00 UTC (permalink / raw)
  To: libc-alpha; +Cc: Ludovic Courtès

Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
the libc.so linker script.

However, when cross-compiling, for example from x86_64-linux-gnu to
aarch64-linux-gnu, "objdump -f" would report the wrong
format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
reports "elf64-littleaarch64" as expected.

This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
'$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
variable.  That way, OBJDUMP is set to TRIPLET-objdump when
cross-compiling for TRIPLET.
---
 aclocal.m4   |  2 --
 configure    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 configure.ac |  1 +
 3 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/aclocal.m4 b/aclocal.m4
index c195c4db56..13a791ffde 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -118,8 +118,6 @@ AS=`$CC -print-prog-name=as`
 LD=`$CC -print-prog-name=ld`
 AR=`$CC -print-prog-name=ar`
 AC_SUBST(AR)
-OBJDUMP=`$CC -print-prog-name=objdump`
-AC_SUBST(OBJDUMP)
 OBJCOPY=`$CC -print-prog-name=objcopy`
 AC_SUBST(OBJCOPY)
 GPROF=`$CC -print-prog-name=gprof`
diff --git a/configure b/configure
index 9619c10991..fe0eda1cd5 100755
--- a/configure
+++ b/configure
@@ -655,7 +655,6 @@ LD
 AS
 GPROF
 OBJCOPY
-OBJDUMP
 AR
 LN_S
 INSTALL_DATA
@@ -690,6 +689,7 @@ sysheaders
 ac_ct_CXX
 CXXFLAGS
 CXX
+OBJDUMP
 READELF
 CPP
 cross_compiling
@@ -2962,6 +2962,98 @@ else
   READELF="$ac_cv_prog_READELF"
 fi
 
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
 
 # We need the C++ compiler only for testing.
 ac_ext=cpp
@@ -4553,8 +4645,6 @@ AS=`$CC -print-prog-name=as`
 LD=`$CC -print-prog-name=ld`
 AR=`$CC -print-prog-name=ar`
 
-OBJDUMP=`$CC -print-prog-name=objdump`
-
 OBJCOPY=`$CC -print-prog-name=objcopy`
 
 GPROF=`$CC -print-prog-name=gprof`
diff --git a/configure.ac b/configure.ac
index 34ecbba540..924af12738 100644
--- a/configure.ac
+++ b/configure.ac
@@ -52,6 +52,7 @@ fi
 AC_SUBST(cross_compiling)
 AC_PROG_CPP
 AC_CHECK_TOOL(READELF, readelf, false)
+AC_CHECK_TOOL(OBJDUMP, objdump, false)
 
 # We need the C++ compiler only for testing.
 AC_PROG_CXX

base-commit: eb68d7d23cc411acdf68a60f194343a6774d6194
-- 
2.32.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
  2021-07-01 21:00 [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling Ludovic Courtès
@ 2022-10-06 14:55 ` Carlos O'Donell
  2022-10-07  9:41   ` Ludovic Courtès
  0 siblings, 1 reply; 5+ messages in thread
From: Carlos O'Donell @ 2022-10-06 14:55 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: libc-alpha

On Thu, Jul 01, 2021 at 11:00:19PM +0200, Ludovic Courtès via Libc-alpha wrote:
> Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
> with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
> the libc.so linker script.
> 
> However, when cross-compiling, for example from x86_64-linux-gnu to
> aarch64-linux-gnu, "objdump -f" would report the wrong
> format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
> reports "elf64-littleaarch64" as expected.
> 
> This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
> '$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
> variable.  That way, OBJDUMP is set to TRIPLET-objdump when
> cross-compiling for TRIPLET.

I've been tackling a backlog of old glibc patches, and this one is up
next. Yes it's been over a year, but this patch still applies and the
idea is sound. I've tested this with build-many-glibcs (bmg) on x86_64
and it has no impact because bmg always sets OBJDUMP. My opinion is that
bmg is the "base standard" for how we build native and cross tooling and
so it your changes work here, they should work in other instances.

The change looks good to me.

No regresions on x86_64.

Would you like me to commit this? :-)

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  aclocal.m4   |  2 --
>  configure    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  configure.ac |  1 +
>  3 files changed, 94 insertions(+), 5 deletions(-)
> 
> diff --git a/aclocal.m4 b/aclocal.m4
> index c195c4db56..13a791ffde 100644
> --- a/aclocal.m4
> +++ b/aclocal.m4
> @@ -118,8 +118,6 @@ AS=`$CC -print-prog-name=as`
>  LD=`$CC -print-prog-name=ld`
>  AR=`$CC -print-prog-name=ar`
>  AC_SUBST(AR)
> -OBJDUMP=`$CC -print-prog-name=objdump`
> -AC_SUBST(OBJDUMP)
>  OBJCOPY=`$CC -print-prog-name=objcopy`
>  AC_SUBST(OBJCOPY)
>  GPROF=`$CC -print-prog-name=gprof`
> diff --git a/configure b/configure
> index 9619c10991..fe0eda1cd5 100755
> --- a/configure
> +++ b/configure
> @@ -655,7 +655,6 @@ LD
>  AS
>  GPROF
>  OBJCOPY
> -OBJDUMP
>  AR
>  LN_S
>  INSTALL_DATA
> @@ -690,6 +689,7 @@ sysheaders
>  ac_ct_CXX
>  CXXFLAGS
>  CXX
> +OBJDUMP
>  READELF
>  CPP
>  cross_compiling
> @@ -2962,6 +2962,98 @@ else
>    READELF="$ac_cv_prog_READELF"
>  fi
>  
> +if test -n "$ac_tool_prefix"; then
> +  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
> +set dummy ${ac_tool_prefix}objdump; ac_word=$2
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
> +$as_echo_n "checking for $ac_word... " >&6; }
> +if ${ac_cv_prog_OBJDUMP+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if test -n "$OBJDUMP"; then
> +  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
> +else
> +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> +for as_dir in $PATH
> +do
> +  IFS=$as_save_IFS
> +  test -z "$as_dir" && as_dir=.
> +    for ac_exec_ext in '' $ac_executable_extensions; do
> +  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
> +    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
> +    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
> +    break 2
> +  fi
> +done
> +  done
> +IFS=$as_save_IFS
> +
> +fi
> +fi
> +OBJDUMP=$ac_cv_prog_OBJDUMP
> +if test -n "$OBJDUMP"; then
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
> +$as_echo "$OBJDUMP" >&6; }
> +else
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +fi
> +
> +
> +fi
> +if test -z "$ac_cv_prog_OBJDUMP"; then
> +  ac_ct_OBJDUMP=$OBJDUMP
> +  # Extract the first word of "objdump", so it can be a program name with args.
> +set dummy objdump; ac_word=$2
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
> +$as_echo_n "checking for $ac_word... " >&6; }
> +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if test -n "$ac_ct_OBJDUMP"; then
> +  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
> +else
> +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> +for as_dir in $PATH
> +do
> +  IFS=$as_save_IFS
> +  test -z "$as_dir" && as_dir=.
> +    for ac_exec_ext in '' $ac_executable_extensions; do
> +  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
> +    ac_cv_prog_ac_ct_OBJDUMP="objdump"
> +    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
> +    break 2
> +  fi
> +done
> +  done
> +IFS=$as_save_IFS
> +
> +fi
> +fi
> +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
> +if test -n "$ac_ct_OBJDUMP"; then
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
> +$as_echo "$ac_ct_OBJDUMP" >&6; }
> +else
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +fi
> +
> +  if test "x$ac_ct_OBJDUMP" = x; then
> +    OBJDUMP="false"
> +  else
> +    case $cross_compiling:$ac_tool_warned in
> +yes:)
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
> +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
> +ac_tool_warned=yes ;;
> +esac
> +    OBJDUMP=$ac_ct_OBJDUMP
> +  fi
> +else
> +  OBJDUMP="$ac_cv_prog_OBJDUMP"
> +fi
> +
>  
>  # We need the C++ compiler only for testing.
>  ac_ext=cpp
> @@ -4553,8 +4645,6 @@ AS=`$CC -print-prog-name=as`
>  LD=`$CC -print-prog-name=ld`
>  AR=`$CC -print-prog-name=ar`
>  
> -OBJDUMP=`$CC -print-prog-name=objdump`
> -
>  OBJCOPY=`$CC -print-prog-name=objcopy`
>  
>  GPROF=`$CC -print-prog-name=gprof`
> diff --git a/configure.ac b/configure.ac
> index 34ecbba540..924af12738 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -52,6 +52,7 @@ fi
>  AC_SUBST(cross_compiling)
>  AC_PROG_CPP
>  AC_CHECK_TOOL(READELF, readelf, false)
> +AC_CHECK_TOOL(OBJDUMP, objdump, false)
>  
>  # We need the C++ compiler only for testing.
>  AC_PROG_CXX
> 
> base-commit: eb68d7d23cc411acdf68a60f194343a6774d6194
> -- 
> 2.32.0
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
  2022-10-06 14:55 ` Carlos O'Donell
@ 2022-10-07  9:41   ` Ludovic Courtès
  2022-10-13 20:56     ` Fangrui Song
  0 siblings, 1 reply; 5+ messages in thread
From: Ludovic Courtès @ 2022-10-07  9:41 UTC (permalink / raw)
  To: Carlos O'Donell; +Cc: libc-alpha

Hi Carlos,

Carlos O'Donell <carlos@redhat.com> skribis:

> On Thu, Jul 01, 2021 at 11:00:19PM +0200, Ludovic Courtès via Libc-alpha wrote:
>> Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
>> with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
>> the libc.so linker script.
>> 
>> However, when cross-compiling, for example from x86_64-linux-gnu to
>> aarch64-linux-gnu, "objdump -f" would report the wrong
>> format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
>> reports "elf64-littleaarch64" as expected.
>> 
>> This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
>> '$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
>> variable.  That way, OBJDUMP is set to TRIPLET-objdump when
>> cross-compiling for TRIPLET.
>
> I've been tackling a backlog of old glibc patches, and this one is up
> next. Yes it's been over a year, but this patch still applies and the
> idea is sound. I've tested this with build-many-glibcs (bmg) on x86_64
> and it has no impact because bmg always sets OBJDUMP. My opinion is that
> bmg is the "base standard" for how we build native and cross tooling and
> so it your changes work here, they should work in other instances.
>
> The change looks good to me.
>
> No regresions on x86_64.
>
> Would you like me to commit this? :-)

I don’t have commit access AFAIK so I’ll happily defer to you.  :-)

Thanks for taking the time to look at the backlog!

Ludo’.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
  2022-10-07  9:41   ` Ludovic Courtès
@ 2022-10-13 20:56     ` Fangrui Song
  2022-10-29  1:45       ` Carlos O'Donell
  0 siblings, 1 reply; 5+ messages in thread
From: Fangrui Song @ 2022-10-13 20:56 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: Carlos O'Donell, libc-alpha

On 2022-10-07, Ludovic Courtès via Libc-alpha wrote:
>Hi Carlos,
>
>Carlos O'Donell <carlos@redhat.com> skribis:
>
>> On Thu, Jul 01, 2021 at 11:00:19PM +0200, Ludovic Courtès via Libc-alpha wrote:
>>> Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
>>> with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
>>> the libc.so linker script.
>>>
>>> However, when cross-compiling, for example from x86_64-linux-gnu to
>>> aarch64-linux-gnu, "objdump -f" would report the wrong
>>> format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
>>> reports "elf64-littleaarch64" as expected.
>>>
>>> This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
>>> '$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
>>> variable.  That way, OBJDUMP is set to TRIPLET-objdump when
>>> cross-compiling for TRIPLET.
>>
>> I've been tackling a backlog of old glibc patches, and this one is up
>> next. Yes it's been over a year, but this patch still applies and the
>> idea is sound. I've tested this with build-many-glibcs (bmg) on x86_64
>> and it has no impact because bmg always sets OBJDUMP. My opinion is that
>> bmg is the "base standard" for how we build native and cross tooling and
>> so it your changes work here, they should work in other instances.
>>
>> The change looks good to me.
>>
>> No regresions on x86_64.
>>
>> Would you like me to commit this? :-)
>
>I don’t have commit access AFAIK so I’ll happily defer to you.  :-)
>
>Thanks for taking the time to look at the backlog!
>
>Ludo’.

Thanks. This looks good.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
  2022-10-13 20:56     ` Fangrui Song
@ 2022-10-29  1:45       ` Carlos O'Donell
  0 siblings, 0 replies; 5+ messages in thread
From: Carlos O'Donell @ 2022-10-29  1:45 UTC (permalink / raw)
  To: Fangrui Song, Ludovic Courtès; +Cc: libc-alpha

On 10/13/22 16:56, Fangrui Song wrote:
> On 2022-10-07, Ludovic Courtès via Libc-alpha wrote:
>> Hi Carlos,
>>
>> Carlos O'Donell <carlos@redhat.com> skribis:
>>
>>> On Thu, Jul 01, 2021 at 11:00:19PM +0200, Ludovic Courtès via Libc-alpha wrote:
>>>> Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
>>>> with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
>>>> the libc.so linker script.
>>>>
>>>> However, when cross-compiling, for example from x86_64-linux-gnu to
>>>> aarch64-linux-gnu, "objdump -f" would report the wrong
>>>> format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
>>>> reports "elf64-littleaarch64" as expected.
>>>>
>>>> This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
>>>> '$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
>>>> variable.  That way, OBJDUMP is set to TRIPLET-objdump when
>>>> cross-compiling for TRIPLET.
>>>
>>> I've been tackling a backlog of old glibc patches, and this one is up
>>> next. Yes it's been over a year, but this patch still applies and the
>>> idea is sound. I've tested this with build-many-glibcs (bmg) on x86_64
>>> and it has no impact because bmg always sets OBJDUMP. My opinion is that
>>> bmg is the "base standard" for how we build native and cross tooling and
>>> so it your changes work here, they should work in other instances.
>>>
>>> The change looks good to me.
>>>
>>> No regresions on x86_64.
>>>
>>> Would you like me to commit this? :-)
>>
>> I don’t have commit access AFAIK so I’ll happily defer to you.  :-)
>>
>> Thanks for taking the time to look at the backlog!
>>
>> Ludo’.
> 
> Thanks. This looks good.
 
Tested again with bmg to cross x86_64 to aarch64. No regressions.

Pushed. Thank you!

-- 
Cheers,
Carlos.


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-10-29  1:45 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-01 21:00 [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling Ludovic Courtès
2022-10-06 14:55 ` Carlos O'Donell
2022-10-07  9:41   ` Ludovic Courtès
2022-10-13 20:56     ` Fangrui Song
2022-10-29  1:45       ` Carlos O'Donell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).