diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6a7bc06c70c666a4a43b5ed3e30a77d681ed5dda..9e876b63d9f2f804fb039762f99889e25d843077 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,8 +1,3 @@
-2023-03-03  Nick Clifton  <nickc@redhat.com>
-
-	PR 30193
-	* ldgram.y (ASCII): Fail if the size is not a constant.
-
 2023-02-23  Fangrui Song  <i@maskray.me>
 
 	* emultempl/riscvelf.em: Add option parsing.
@@ -17,25 +12,6 @@
 	* pe-dll.c (pe_dll_build_sections): Do not build an edata section
 	if all symbols are being excluded.
 
-2023-02-16  Ulf Samuelsson <binutils@emagii.com>
-	    Nick Clifton  <nickc@redhat.com>
-
-	* ldlex.l: Add ASCII token.
-	* ldgram.y: Add parsing of the ASCII command.
-	* ldlang.c (lang_add_string): Add maximum size parameter.  Move
-	escape character handling code into separate function.
-	* ldlang.h (lang_add_string): Update prototype.
-	* NEWS: Mention the new feature.
-	* ld.texi (Output Section Data): Document the new directives.
-	* testsuite/ld-scripts/asciz.t: Adjust to work on more architectures
-	and to test more aspects of the ASCIZ directive.
-	* testsuite/ld-scripts/asciz.d: Adjust to match the changes to the
-	test linker script.
-	* testsuite/ld-scripts/ascii.d: New test driver.
-	* testsuite/ld-scripts/ascii.s: New test assembler source.
-	* testsuite/ld-scripts/ascii.t: New test script.
-	* testsuite/ld-scripts/script.exp: Run the new test.
-
 2023-02-15  Nick Clifton  <nickc@redhat.com>
 
 	PR 30078
diff --git a/ld/NEWS b/ld/NEWS
index 4b91f2c3b0a451ab23a9e761e5592b18a18ee95e..4ce7e19d40b9222dce7cb7bd9db6b2437b54c271 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,12 +1,6 @@
 -*- text -*-
 
-* The linker script syntax has two new commands for inserting text into output
-  sections:
-    ASCII (<size>) "string"
-  This will reserve a zero filled block of <size> bytes at the current
-  location and insert "string" at the beginning of the block.  If the string
-  is too long, it will be truncated.
-    ASCIZ "string"
+* The linker script syntax has a new command for output sections: ASCIZ "string"
   This will insert a zero-terminated string at the current location.
 
 Changes in 2.40:
diff --git a/ld/ld.texi b/ld/ld.texi
index 3367075cae841dc584aa011452a7656dce56f2b7..8205d4e67714219c3dd8124367318f25c71caf7f 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -5308,6 +5308,7 @@ C identifiers because they contain a @samp{.} character.
 @cindex data
 @cindex section data
 @cindex output section data
+@kindex ASCIZ ``@var{string}''
 @kindex BYTE(@var{expression})
 @kindex SHORT(@var{expression})
 @kindex LONG(@var{expression})
@@ -5344,6 +5345,18 @@ When the object file format does not have an explicit endianness, as is
 true of, for example, S-records, the value will be stored in the
 endianness of the first input object file.
 
+You can include a zero-terminated string in an output section by using
+@code{ASCIZ}.  The keyword is followed by a string which is stored at
+the current value of the location counter adding a zero byte at the
+end.  If the string includes spaces it must be enclosed in double
+quotes.  The string may contain '\n', '\r', '\t' and octal numbers.
+Hex numbers are not supported.
+
+For example, this string of 16 characters will create a 17 byte area
+@smallexample
+  ASCIZ "This is 16 bytes"
+@end smallexample
+
 Note---these commands only work inside a section description and not
 between them, so the following will produce an error from the linker:
 @smallexample
@@ -5354,46 +5367,6 @@ whereas this will work:
 SECTIONS @{@ .text : @{@ *(.text) ; LONG(1) @}@ .data : @{@ *(.data) @}@ @}@
 @end smallexample
 
-@cindex output section strings
-@kindex ASCII (@var{expression}) ``@var{string}''
-@kindex ASCIZ ``@var{string}''
-You can include a zero-terminated string in an output section by using
-@code{ASCIZ}.  The keyword is followed by a string which is stored at
-the current value of the location counter including adding a zero byte
-at the end.  Any length of string is supported by this directive.
-
-You can include a fixed size string in an output section by using
-@code{ASCII}.  The keyword is followed by a size enclosed in
-parentheses and then a string.  The string is stored at the current
-value of the location counter and zero bytes are added at the end to
-fill up to the specified size.  Note the fill value is ignored for
-this padding.
-
-If the string is too long, a warning is issued and the string is
-truncated.  The string will still be zero-terminated in this case.
-
-If the expression evaluates to zero then the directive will be treated
-as if it were @code{ASCIZ} instead.
-
-If the string in an @code{ASCII} or @code{ASCIZ} command includes spaces
-it must be enclosed in double quotes.
-
-The string can have C escape characters like '\n', '\r', '\t' and
-octal numbers.  The '\"' escape is not supported.  Nor are escaped hex
-values.
-
-Example 1: This is string of 16 characters and will create a 32 byte
-area:
-@smallexample
-  ASCII (32) "This is 16 bytes"
-@end smallexample
-
-Example 2: This is a string of 16 characters and will create a 17 byte
-area:
-@smallexample
-  ASCIZ "This is 16 bytes"
-@end smallexample
-
 @kindex FILL(@var{expression})
 @cindex holes, filling
 @cindex unspecified memory
diff --git a/ld/ldgram.y b/ld/ldgram.y
index 26e56fe15660088c5d9e2bd52d0c1f973684ec76..8240cf97327d226e985fd8fb103b2ef34119904d 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -125,7 +125,7 @@ static int error_index;
 %right UNARY
 %token END
 %left <token> '('
-%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE ASCII ASCIZ
+%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE ASCIZ
 %token SECTIONS PHDRS INSERT_K AFTER BEFORE
 %token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
 %token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
@@ -668,18 +668,9 @@ statement:
 		{
 		  lang_add_data ((int) $1, $3);
 		}
-        | ASCII '(' mustbe_exp ')' NAME
-		{
-		  /* 'value' is a memory leak, do we care?  */
-		  etree_type *value = $3;
-		  if (value->type.node_code == INT)
-		    lang_add_string (value->value.value, $5);
-		  else
-		    einfo (_("%X%P:%pS: ASCII expression must be an integer\n"), NULL);
-		}
 	| ASCIZ NAME
 		{
-		  lang_add_string (0, $2);
+		  lang_add_string ($2);
 		}
 	| FILL '(' fill_exp ')'
 		{
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 295de015da9dc94a2de131de9fe0f9d042b43afc..61de63809cd36a6d07d304316cd602745a078cdb 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -8400,20 +8400,15 @@ lang_add_data (int type, union etree_union *exp)
   new_stmt->type = type;
 }
 
-/* Convert escape codes in S.
-   Supports \n, \r, \t and \NNN octals.
-   Returns a copy of S in a malloc'ed buffer.  */
-
-static char *
-convert_string (const char * s)
+void
+lang_add_string (const char *s)
 {
-  size_t  len = strlen (s);
-  size_t  i;
-  bool    escape = false;
-  char *  buffer = malloc (len + 1);
-  char *  b;
+  bfd_vma  len = strlen (s);
+  bfd_vma  i;
+  bool     escape = false;
 
-  for (i = 0, b = buffer; i < len; i++)
+  /* Add byte expressions until end of string.  */
+  for (i = 0 ; i < len; i++)
     {
       char c = *s++;
 
@@ -8448,7 +8443,7 @@ convert_string (const char * s)
 		    value += (c - '0');
 		    i++;
 		    s++;
- 
+
 		    c = *s;
 		    if ((c >= '0') && (c <= '7'))
 		      {
@@ -8466,58 +8461,26 @@ convert_string (const char * s)
 		    i--;
 		    s--;
 		  }
-		
+
 		c = value;
 	      }
 	      break;
 	    }
+
+	  lang_add_data (BYTE, exp_intop (c));
 	  escape = false;
 	}
       else
 	{
 	  if (c == '\\')
-	    {
-	      escape = true;
-	      continue;
-	    }
+	    escape = true;
+	  else
+	    lang_add_data (BYTE, exp_intop (c));
 	}
-
-      * b ++ = c;
-    }
-
-  * b = 0;
-  return buffer;
-}
-
-void
-lang_add_string (size_t size, const char *s)
-{
-  size_t  len;
-  size_t  i;
-  char *  string;
-
-  string = convert_string (s);
-  len = strlen (string);
-
-  /* Check if it is ASCIZ command (len == 0) */
-  if (size == 0)
-    /* Make sure that we include the terminating nul byte.  */
-    size = len + 1;
-  else if (len >= size)
-    {
-      len = size - 1;
-
-      einfo (_("%P:%pS: warning: ASCII string does not fit in allocated space,"
-               " truncated\n"), NULL);
     }
 
-  for (i = 0 ; i < len ; i++)
-    lang_add_data (BYTE, exp_intop (string[i]));
-
-  while (i++ < size)
-    lang_add_data (BYTE, exp_intop ('\0'));
-
-  free (string);
+  /* Remeber to terminate the string.  */
+  lang_add_data (BYTE, exp_intop (0));
 }
 
 /* Create a new reloc statement.  RELOC is the BFD relocation type to
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 2300fa5b2a34498b0df4c90b5ed152ec4b314682..32819066b8a41e249bb0d3d9aab84e1ebd1259f8 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -646,9 +646,8 @@ extern void pop_stat_ptr
   (void);
 extern void lang_add_data
   (int, union etree_union *);
-extern bfd_vma charcount(const char *s);
 extern void lang_add_string
-  (size_t, const char *s);
+  (const char *);
 extern void lang_add_reloc
   (bfd_reloc_code_real_type, reloc_howto_type *, asection *, const char *,
    union etree_union *);
diff --git a/ld/ldlex.l b/ld/ldlex.l
index 910e7ea3b8b8da748dd29b276934572e4d1743ee..32336cf0be2c7d06a9fdd106f1f0ab4d5acf2e3d 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -309,7 +309,6 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <WILD>"LONG"				{ RTOKEN(LONG); }
 <WILD>"SHORT"				{ RTOKEN(SHORT); }
 <WILD>"BYTE"				{ RTOKEN(BYTE); }
-<WILD>"ASCII"				{ RTOKEN(ASCII); }
 <WILD>"ASCIZ"				{ RTOKEN(ASCIZ); }
 <SCRIPT>"NOFLOAT"			{ RTOKEN(NOFLOAT); }
 <SCRIPT,EXPRESSION>"NOCROSSREFS"	{ RTOKEN(NOCROSSREFS); }
diff --git a/ld/testsuite/ld-scripts/ascii.d b/ld/testsuite/ld-scripts/ascii.d
deleted file mode 100644
index ff3bd328c15893174c952f1b14076cc63a630aab..0000000000000000000000000000000000000000
--- a/ld/testsuite/ld-scripts/ascii.d
+++ /dev/null
@@ -1,25 +0,0 @@
-#source: ascii.s
-#ld: -T ascii.t
-#objdump: -s -j .header
-#target: [is_elf_format] [is_coff_format]
-#notarget: tic4x-*-* tic54x-*-*
-
-.*:     file format .*
-
-Contents of section .header:
- .... 70726f67 72616d20 6e616d65 00000000  program name....
- .... 656d7074 79000000 00000000 00000000  empty...........
- .... 00000000 00000000 00000000 00000000  ................
- .... 00000000 00000000 00000000 00000000  ................
- .... 00000000 00000000 00000000 00000000  ................
- .... 636f6d6d 656e7420 310a0000 00000000  comment 1.......
- .... 00000000 00000000 00000000 00000000  ................
- .... 636f6d6d 656e7420 320a0000 00000000  comment 2.......
- .... 00000000 00000000 00000000 00000000  ................
- .... 636f6d6d 656e7420 330a0000 00000000  comment 3.......
- .... 00000000 00000000 00000000 00000000  ................
- .... 636f6d6d 656e7420 340a0000 00000000  comment 4.......
- .... 00000000 00000000 49206d65 616e7420  ........I meant 
- .... 746f2073 61793a20 54686973 20697320  to say: This is 
- .... 77617920 746f6f20 6c6f6e67 00000000  way too long....
-#pass
diff --git a/ld/testsuite/ld-scripts/ascii.s b/ld/testsuite/ld-scripts/ascii.s
deleted file mode 100644
index a1b6148dc7900cdb5411570a22b4a764558cd1f0..0000000000000000000000000000000000000000
--- a/ld/testsuite/ld-scripts/ascii.s
+++ /dev/null
@@ -1,11 +0,0 @@
-        .extern ecc_start
-	.section .text
-main:
-	.long 0x45444F43
-	.long 0x12345678
-	
-	.section .data
-	.long 0x9abcdef0
-	
-	.section .bss
-	.long 0
diff --git a/ld/testsuite/ld-scripts/ascii.t b/ld/testsuite/ld-scripts/ascii.t
deleted file mode 100644
index 6f682fabd384b042da5fab1f13560353763266f9..0000000000000000000000000000000000000000
--- a/ld/testsuite/ld-scripts/ascii.t
+++ /dev/null
@@ -1,38 +0,0 @@
-_start = 0x000000;
-
-SECTIONS
-{
-  . = 0x1000 + SIZEOF_HEADERS;
-
-  .header ALIGN (0x100) (READONLY) :
-    {
-      ASCII (16) "program name"
-      ASCII (64) "empty"
-      ASCII (4 * 8) "comment 1\n"
-      ASCII (32) "comment 2\n"
-      ASCII (32) "comment 3\n"
-      ASCII (24) "comment 4\n"
-      ASCII (64) "I meant to say: This is way too long"
-    }
-
-  .text ALIGN (0x100) :
-  {
-      entry = .;
-      *(.text)
-  }
-
-  .data : AT (0x400000)
-  {
-	*(.data)
-  }
-  
-  . = ALIGN(0x20);
-  
-  .bss :
-  {
-	*(.bss)
-  }
-
-  /DISCARD/ : { *(*) }
-}
-
diff --git a/ld/testsuite/ld-scripts/script.exp b/ld/testsuite/ld-scripts/script.exp
index 56e12da8e616c566793fc798835e545fb8c8bbe1..a574dde034c6b990f50f663e2b50030e18c3f0f4 100644
--- a/ld/testsuite/ld-scripts/script.exp
+++ b/ld/testsuite/ld-scripts/script.exp
@@ -228,7 +228,6 @@ foreach test_script $test_script_list {
 }
 
 run_dump_test "asciz"
-run_dump_test "ascii"
 run_dump_test "align-with-input"
 run_dump_test "pr20302"
 run_dump_test "output-section-types"