public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH, LD] Make import libraries relocatable objects
@ 2017-04-27 10:41 Thomas Preudhomme
  2017-05-04  9:08 ` [PATCH, LD, ping] " Thomas Preudhomme
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Preudhomme @ 2017-04-27 10:41 UTC (permalink / raw)
  To: Richard Earnshaw, Nick Clifton, Alan Modra, binutils

[-- Attachment #1: Type: text/plain, Size: 1397 bytes --]

Hi,

For ELF targets --out-implib currently generates an executable file
(e_type is ET_EXEC) despite the file being expected to be linked against
some other object file to make an executable later. It seems therefore
more sensible to make the import library a relocatable object file
(e_type set to ET_REL).

Incidentally, as dicted by requirement 8 of
"ARM v8-M Security Extensions: Requirements on Development Tools"
(document ARM-ECM-0359818) version 1.0, import libraries generated when
using --cmse-implib *must* be relocatable object file so this commit
also adds an assert there in case the type of ELF import library is
changed again in the future.

ChangeLog entry is as follows:

*** bfd/ChangeLog ***

2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>

	* elflink.c (elf_output_implib): Remove executable flag from import
	library bfd.
	* elf32-arm.c (elf32_arm_filter_implib_symbols): Assert that the import
	library is a relocatable object file.

*** ld/ChangeLog ***

2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>

	* testsuite/ld-arm/arm-elf.exp
	(Secure gateway import library generation): Check e_type field
	of import library and executable produced.
	* testsuite/ld-arm/cmse-implib.type: Expectations for e_type field.

Testing: testsuite shows no regression when run for arm-none-eabi and
armeb-none-eabi.

Is this ok for master?

Best regards,

Thomas

[-- Attachment #2: relocatable_object_implib.patch --]
[-- Type: text/x-patch, Size: 2565 bytes --]

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index bc245f89d9f41a2e8d263b4c76a0123afdf61325..967b3b231ac18cbd865a668b5333b9e08a8400f4 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -17509,6 +17509,7 @@ elf32_arm_filter_implib_symbols (bfd *abfd ATTRIBUTE_UNUSED,
 {
   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
 
+  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
   if (globals->cmse_implib)
     return elf32_arm_filter_cmse_symbols (abfd, info, syms, symcount);
   else
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 776357fe68521ba11a7f443f48e3b93409ae2dc4..2dd61d106c068cf49f5723bc6c690c647c8f57dd 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -11206,10 +11206,11 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info)
   if (!bfd_set_format (implib_bfd, bfd_object))
     return FALSE;
 
+  /* Use flag from executable but make it a relocatable object.  */
   flags = bfd_get_file_flags (abfd);
   flags &= ~HAS_RELOC;
   if (!bfd_set_start_address (implib_bfd, 0)
-      || !bfd_set_file_flags (implib_bfd, flags))
+      || !bfd_set_file_flags (implib_bfd, flags & ~EXEC_P))
     return FALSE;
 
   /* Copy architecture of output file to import library file.  */
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 36b58591facabe839a4209aed65deee97e46c3ab..b15316c2176198c70cea9900fce5999f4ab23ea9 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -691,7 +691,8 @@ set armeabitests_nonacl {
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
      "-march=armv8-m.base -mthumb --defsym VER=1"
      {cmse-implib.s}
-     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}}
+     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}
+      {readelf {-h tmpdir/cmse-implib.lib} cmse-implib.type}}
      "cmse-implib"}
     {"Input secure gateway import library"
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-new-implib.lib --in-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
diff --git a/ld/testsuite/ld-arm/cmse-implib.type b/ld/testsuite/ld-arm/cmse-implib.type
new file mode 100644
index 0000000000000000000000000000000000000000..7bb3bccc8e5d0ee99a0b9a2674296673b1c3c349
--- /dev/null
+++ b/ld/testsuite/ld-arm/cmse-implib.type
@@ -0,0 +1,9 @@
+#...
+File: tmpdir/cmse-implib.lib
+#...
+[[:space:]]+Type:[[:space:]]+REL \(Relocatable file\)
+#...
+File: tmpdir/cmse-implib
+#...
+[[:space:]]+Type:[[:space:]]+EXEC \(Executable file\)
+#...

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-04-27 10:41 [PATCH, LD] Make import libraries relocatable objects Thomas Preudhomme
@ 2017-05-04  9:08 ` Thomas Preudhomme
  2017-05-05  9:14   ` Nick Clifton
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Preudhomme @ 2017-05-04  9:08 UTC (permalink / raw)
  To: Richard Earnshaw, Nick Clifton, Alan Modra, binutils

[-- Attachment #1: Type: text/plain, Size: 1568 bytes --]

Ping?

Best regards,

Thomas

On 27/04/17 11:41, Thomas Preudhomme wrote:
> Hi,
>
> For ELF targets --out-implib currently generates an executable file
> (e_type is ET_EXEC) despite the file being expected to be linked against
> some other object file to make an executable later. It seems therefore
> more sensible to make the import library a relocatable object file
> (e_type set to ET_REL).
>
> Incidentally, as dicted by requirement 8 of
> "ARM v8-M Security Extensions: Requirements on Development Tools"
> (document ARM-ECM-0359818) version 1.0, import libraries generated when
> using --cmse-implib *must* be relocatable object file so this commit
> also adds an assert there in case the type of ELF import library is
> changed again in the future.
>
> ChangeLog entry is as follows:
>
> *** bfd/ChangeLog ***
>
> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>
>     * elflink.c (elf_output_implib): Remove executable flag from import
>     library bfd.
>     * elf32-arm.c (elf32_arm_filter_implib_symbols): Assert that the import
>     library is a relocatable object file.
>
> *** ld/ChangeLog ***
>
> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>
>     * testsuite/ld-arm/arm-elf.exp
>     (Secure gateway import library generation): Check e_type field
>     of import library and executable produced.
>     * testsuite/ld-arm/cmse-implib.type: Expectations for e_type field.
>
> Testing: testsuite shows no regression when run for arm-none-eabi and
> armeb-none-eabi.
>
> Is this ok for master?
>
> Best regards,
>
> Thomas

[-- Attachment #2: relocatable_object_implib.patch --]
[-- Type: text/x-patch, Size: 2565 bytes --]

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index bc245f89d9f41a2e8d263b4c76a0123afdf61325..967b3b231ac18cbd865a668b5333b9e08a8400f4 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -17509,6 +17509,7 @@ elf32_arm_filter_implib_symbols (bfd *abfd ATTRIBUTE_UNUSED,
 {
   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
 
+  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
   if (globals->cmse_implib)
     return elf32_arm_filter_cmse_symbols (abfd, info, syms, symcount);
   else
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 776357fe68521ba11a7f443f48e3b93409ae2dc4..2dd61d106c068cf49f5723bc6c690c647c8f57dd 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -11206,10 +11206,11 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info)
   if (!bfd_set_format (implib_bfd, bfd_object))
     return FALSE;
 
+  /* Use flag from executable but make it a relocatable object.  */
   flags = bfd_get_file_flags (abfd);
   flags &= ~HAS_RELOC;
   if (!bfd_set_start_address (implib_bfd, 0)
-      || !bfd_set_file_flags (implib_bfd, flags))
+      || !bfd_set_file_flags (implib_bfd, flags & ~EXEC_P))
     return FALSE;
 
   /* Copy architecture of output file to import library file.  */
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 36b58591facabe839a4209aed65deee97e46c3ab..b15316c2176198c70cea9900fce5999f4ab23ea9 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -691,7 +691,8 @@ set armeabitests_nonacl {
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
      "-march=armv8-m.base -mthumb --defsym VER=1"
      {cmse-implib.s}
-     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}}
+     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}
+      {readelf {-h tmpdir/cmse-implib.lib} cmse-implib.type}}
      "cmse-implib"}
     {"Input secure gateway import library"
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-new-implib.lib --in-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
diff --git a/ld/testsuite/ld-arm/cmse-implib.type b/ld/testsuite/ld-arm/cmse-implib.type
new file mode 100644
index 0000000000000000000000000000000000000000..7bb3bccc8e5d0ee99a0b9a2674296673b1c3c349
--- /dev/null
+++ b/ld/testsuite/ld-arm/cmse-implib.type
@@ -0,0 +1,9 @@
+#...
+File: tmpdir/cmse-implib.lib
+#...
+[[:space:]]+Type:[[:space:]]+REL \(Relocatable file\)
+#...
+File: tmpdir/cmse-implib
+#...
+[[:space:]]+Type:[[:space:]]+EXEC \(Executable file\)
+#...

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-05-04  9:08 ` [PATCH, LD, ping] " Thomas Preudhomme
@ 2017-05-05  9:14   ` Nick Clifton
  2017-05-05 13:21     ` Thomas Preudhomme
  0 siblings, 1 reply; 8+ messages in thread
From: Nick Clifton @ 2017-05-05  9:14 UTC (permalink / raw)
  To: Thomas Preudhomme, Richard Earnshaw, Alan Modra, binutils

Hi Thomas,

> Ping?

Oops - sorry - I was assuming that one of the ARM maintainers would look at this.

>> *** bfd/ChangeLog ***
>>
>> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>
>>     * elflink.c (elf_output_implib): Remove executable flag from import
>>     library bfd.
>>     * elf32-arm.c (elf32_arm_filter_implib_symbols): Assert that the import
>>     library is a relocatable object file.
>>
>> *** ld/ChangeLog ***
>>
>> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>
>>     * testsuite/ld-arm/arm-elf.exp
>>     (Secure gateway import library generation): Check e_type field
>>     of import library and executable produced.
>>     * testsuite/ld-arm/cmse-implib.type: Expectations for e_type field.
>>
>> Testing: testsuite shows no regression when run for arm-none-eabi and
>> armeb-none-eabi.
>>
>> Is this ok for master?

Approved - please apply, but, please could you make one small change:

+  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
 
Please could you add a comment above this assert referencing the ARM ECM
document and explaining why the check is here ?

Cheers
  Nick

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-05-05  9:14   ` Nick Clifton
@ 2017-05-05 13:21     ` Thomas Preudhomme
  2017-05-08  8:51       ` Nick Clifton via binutils
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Preudhomme @ 2017-05-05 13:21 UTC (permalink / raw)
  To: Nick Clifton, Richard Earnshaw, Alan Modra, binutils



On 05/05/17 10:14, Nick Clifton wrote:
> Hi Thomas,
>
>> Ping?
>
> Oops - sorry - I was assuming that one of the ARM maintainers would look at this.

Actually this specific patch also needs a global reviewer because it changes the 
behavior of the target-independent --out-implib feature as well which is why I 
didn't add the ARM tag in the subject.

>
>>> *** bfd/ChangeLog ***
>>>
>>> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>>
>>>     * elflink.c (elf_output_implib): Remove executable flag from import
>>>     library bfd.
>>>     * elf32-arm.c (elf32_arm_filter_implib_symbols): Assert that the import
>>>     library is a relocatable object file.
>>>
>>> *** ld/ChangeLog ***
>>>
>>> 2017-04-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>>
>>>     * testsuite/ld-arm/arm-elf.exp
>>>     (Secure gateway import library generation): Check e_type field
>>>     of import library and executable produced.
>>>     * testsuite/ld-arm/cmse-implib.type: Expectations for e_type field.
>>>
>>> Testing: testsuite shows no regression when run for arm-none-eabi and
>>> armeb-none-eabi.
>>>
>>> Is this ok for master?
>
> Approved - please apply, but, please could you make one small change:
>
> +  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
>
> Please could you add a comment above this assert referencing the ARM ECM
> document and explaining why the check is here ?

Will do. Can you confirm you are happy with the target-independent change as well?

Best regards,

Thomas

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-05-05 13:21     ` Thomas Preudhomme
@ 2017-05-08  8:51       ` Nick Clifton via binutils
  2017-05-08 14:29         ` Thomas Preudhomme
  0 siblings, 1 reply; 8+ messages in thread
From: Nick Clifton via binutils @ 2017-05-08  8:51 UTC (permalink / raw)
  To: Thomas Preudhomme, Richard Earnshaw, Alan Modra, binutils

Hi Thomas,

> Will do. Can you confirm you are happy with the target-independent change as well?

I am.

As far as I know only the ARM target is actually using ELF based import libraries at the moment.

Cheers
  Nick


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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-05-08  8:51       ` Nick Clifton via binutils
@ 2017-05-08 14:29         ` Thomas Preudhomme
  2017-06-20  9:53           ` Thomas Preudhomme
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Preudhomme @ 2017-05-08 14:29 UTC (permalink / raw)
  To: Nick Clifton, Richard Earnshaw, Alan Modra, binutils

[-- Attachment #1: Type: text/plain, Size: 370 bytes --]

Great then. Committed the attached updated patch as per your comments.

Best regards,

Thomas

On 08/05/17 09:51, Nick Clifton wrote:
> Hi Thomas,
>
>> Will do. Can you confirm you are happy with the target-independent change as well?
>
> I am.
>
> As far as I know only the ARM target is actually using ELF based import libraries at the moment.
>
> Cheers
>   Nick
>
>

[-- Attachment #2: relocatable_object_implib.patch --]
[-- Type: text/x-patch, Size: 2761 bytes --]

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 434649f1ca18841320345e7fdf437c4ad47a1428..8dcaf45523e726dc71ff8df8bdbd07ba759120fb 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -17498,6 +17498,10 @@ elf32_arm_filter_implib_symbols (bfd *abfd ATTRIBUTE_UNUSED,
 {
   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
 
+  /* Requirement 8 of "ARM v8-M Security Extensions: Requirements on
+     Development Tools" (ARM-ECM-0359818) mandates Secure Gateway import
+     library to be a relocatable object file.  */
+  BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
   if (globals->cmse_implib)
     return elf32_arm_filter_cmse_symbols (abfd, info, syms, symcount);
   else
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 4af4b1cd3d33c0b566349d545038accee4ffd51a..f8555d802f62bc2e2c46d50959f9bd1b2f0a7177 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -11271,10 +11271,11 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info)
   if (!bfd_set_format (implib_bfd, bfd_object))
     return FALSE;
 
+  /* Use flag from executable but make it a relocatable object.  */
   flags = bfd_get_file_flags (abfd);
   flags &= ~HAS_RELOC;
   if (!bfd_set_start_address (implib_bfd, 0)
-      || !bfd_set_file_flags (implib_bfd, flags))
+      || !bfd_set_file_flags (implib_bfd, flags & ~EXEC_P))
     return FALSE;
 
   /* Copy architecture of output file to import library file.  */
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 1a4d262e60816f6ebaa44e54a32125985bf7d0f2..2e193324907e71b86d56f9c82adca1cae3c025a8 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -685,7 +685,8 @@ set armeabitests_nonacl {
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
      "-march=armv8-m.base -mthumb --defsym VER=1"
      {cmse-implib.s}
-     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}}
+     {{readelf {-s tmpdir/cmse-implib.lib} cmse-implib.rd}
+      {readelf {-h tmpdir/cmse-implib.lib} cmse-implib.type}}
      "cmse-implib"}
     {"Input secure gateway import library"
      "--section-start .gnu.sgstubs=0x20000 --out-implib=tmpdir/cmse-new-implib.lib --in-implib=tmpdir/cmse-implib.lib --cmse-implib" ""
diff --git a/ld/testsuite/ld-arm/cmse-implib.type b/ld/testsuite/ld-arm/cmse-implib.type
new file mode 100644
index 0000000000000000000000000000000000000000..7bb3bccc8e5d0ee99a0b9a2674296673b1c3c349
--- /dev/null
+++ b/ld/testsuite/ld-arm/cmse-implib.type
@@ -0,0 +1,9 @@
+#...
+File: tmpdir/cmse-implib.lib
+#...
+[[:space:]]+Type:[[:space:]]+REL \(Relocatable file\)
+#...
+File: tmpdir/cmse-implib
+#...
+[[:space:]]+Type:[[:space:]]+EXEC \(Executable file\)
+#...

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-05-08 14:29         ` Thomas Preudhomme
@ 2017-06-20  9:53           ` Thomas Preudhomme
  2017-06-20 10:00             ` Tristan Gingold
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Preudhomme @ 2017-06-20  9:53 UTC (permalink / raw)
  To: Nick Clifton, Richard Earnshaw, Alan Modra, binutils, Tristan Gingold

Hi Tristan,

Is this ok to be backported to binutils 2.28?

It applies cleanly on binutils-2_28-branch and testsuite shows no regression.

Best regards,

Thomas

On 08/05/17 15:29, Thomas Preudhomme wrote:
> Great then. Committed the attached updated patch as per your comments.
>
> Best regards,
>
> Thomas
>
> On 08/05/17 09:51, Nick Clifton wrote:
>> Hi Thomas,
>>
>>> Will do. Can you confirm you are happy with the target-independent change as
>>> well?
>>
>> I am.
>>
>> As far as I know only the ARM target is actually using ELF based import
>> libraries at the moment.
>>
>> Cheers
>>   Nick
>>
>>

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

* Re: [PATCH, LD, ping] Make import libraries relocatable objects
  2017-06-20  9:53           ` Thomas Preudhomme
@ 2017-06-20 10:00             ` Tristan Gingold
  0 siblings, 0 replies; 8+ messages in thread
From: Tristan Gingold @ 2017-06-20 10:00 UTC (permalink / raw)
  To: Thomas Preudhomme, Nick Clifton, Richard Earnshaw, Alan Modra, binutils

On 20/06/2017 11:53, Thomas Preudhomme wrote:
> Hi Tristan,
>
> Is this ok to be backported to binutils 2.28?

Yes, that's ok.

>
> It applies cleanly on binutils-2_28-branch and testsuite shows no
> regression.
>
> Best regards,
>
> Thomas
>
> On 08/05/17 15:29, Thomas Preudhomme wrote:
>> Great then. Committed the attached updated patch as per your comments.
>>
>> Best regards,
>>
>> Thomas
>>
>> On 08/05/17 09:51, Nick Clifton wrote:
>>> Hi Thomas,
>>>
>>>> Will do. Can you confirm you are happy with the target-independent
>>>> change as
>>>> well?
>>>
>>> I am.
>>>
>>> As far as I know only the ARM target is actually using ELF based import
>>> libraries at the moment.
>>>
>>> Cheers
>>>   Nick
>>>
>>>

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

end of thread, other threads:[~2017-06-20 10:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-27 10:41 [PATCH, LD] Make import libraries relocatable objects Thomas Preudhomme
2017-05-04  9:08 ` [PATCH, LD, ping] " Thomas Preudhomme
2017-05-05  9:14   ` Nick Clifton
2017-05-05 13:21     ` Thomas Preudhomme
2017-05-08  8:51       ` Nick Clifton via binutils
2017-05-08 14:29         ` Thomas Preudhomme
2017-06-20  9:53           ` Thomas Preudhomme
2017-06-20 10:00             ` Tristan Gingold

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).