Home | History | Annotate | Download | only in tests
      1 /* Copyright (C) 2002, 2004 Red Hat, Inc.
      2    Written by Ulrich Drepper <drepper (at) redhat.com>, 2002.
      3 
      4    This program is Open Source software; you can redistribute it and/or
      5    modify it under the terms of the Open Software License version 1.0 as
      6    published by the Open Source Initiative.
      7 
      8    You should have received a copy of the Open Software License along
      9    with this program; if not, you may obtain a copy of the Open Software
     10    License version 1.0 from http://www.opensource.org/licenses/osl.php or
     11    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
     12    3001 King Ranch Road, Ukiah, CA 95482.   */
     13 
     14 #include <fcntl.h>
     15 #include <libasm.h>
     16 #include <libelf.h>
     17 #include <stdio.h>
     18 #include <stdlib.h>
     19 #include <string.h>
     20 #include <unistd.h>
     21 #include <sys/wait.h>
     22 
     23 #include "system.h"
     24 
     25 
     26 static const char fname[] = "asm-tst5-out.o";
     27 
     28 
     29 int
     30 main (void)
     31 {
     32   AsmCtx_t *ctx;
     33   int result = 0;
     34   size_t cnt;
     35 
     36   elf_version (EV_CURRENT);
     37 
     38   ctx = asm_begin (fname, false, EM_386, ELFCLASS32, ELFDATA2LSB);
     39   if (ctx == NULL)
     40     {
     41       printf ("cannot create assembler context: %s\n", asm_errmsg (-1));
     42       return 1;
     43     }
     44 
     45   /* Create 66000 sections.  */
     46   for (cnt = 0; cnt < 66000; ++cnt)
     47     {
     48       char buf[20];
     49       AsmScn_t *scn;
     50 
     51       /* Create a unique name.  */
     52       snprintf (buf, sizeof (buf), ".data.%Zu", cnt);
     53 
     54       /* Create the section.  */
     55       scn = asm_newscn (ctx, buf, SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
     56       if (scn == NULL)
     57 	{
     58 	  printf ("cannot create section \"%s\" in output file: %s\n",
     59 		  buf, asm_errmsg (-1));
     60 	  asm_abort (ctx);
     61 	  return 1;
     62 	}
     63 
     64       /* Add a name.  */
     65       snprintf (buf, sizeof (buf), "%Zu", cnt);
     66       if (asm_newsym (scn, buf, sizeof (uint32_t), STT_OBJECT,
     67 		      STB_GLOBAL) == NULL)
     68 	{
     69 	  printf ("cannot create symbol \"%s\": %s\n", buf, asm_errmsg (-1));
     70 	  asm_abort (ctx);
     71 	  return 1;
     72 	}
     73 
     74       /* Add some content.  */
     75       if (asm_adduint32 (scn, cnt) != 0)
     76 	{
     77 	  printf ("cannot create content of section \"%s\": %s\n",
     78 		  buf, asm_errmsg (-1));
     79 	  asm_abort (ctx);
     80 	  return 1;
     81 	}
     82     }
     83 
     84   /* Create the output file.  */
     85   if (asm_end (ctx) != 0)
     86     {
     87       printf ("cannot create output file: %s\n", asm_errmsg (-1));
     88       asm_abort (ctx);
     89       return 1;
     90     }
     91 
     92   if (result == 0)
     93     result = WEXITSTATUS (system ("\
     94 env LD_LIBRARY_PATH=../libelf ../src/elflint -q asm-tst5-out.o"));
     95 
     96   /* We don't need the file anymore.  */
     97   unlink (fname);
     98 
     99   return result;
    100 }
    101