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 <libasm.h>
     15 #include <libelf.h>
     16 #include <stdio.h>
     17 #include <stdlib.h>
     18 #include <unistd.h>
     19 #include <sys/wait.h>
     20 
     21 #include <system.h>
     22 
     23 
     24 static const char fname[] = "asm-tst6-out.o";
     25 
     26 
     27 int
     28 main (void)
     29 {
     30   AsmCtx_t *ctx;
     31   int result = 0;
     32   size_t cnt;
     33 
     34   elf_version (EV_CURRENT);
     35 
     36   ctx = asm_begin (fname, false, EM_386, ELFCLASS32, ELFDATA2LSB);
     37   if (ctx == NULL)
     38     {
     39       printf ("cannot create assembler context: %s\n", asm_errmsg (-1));
     40       return 1;
     41     }
     42 
     43   for (cnt = 0; cnt < 22000; ++cnt)
     44     {
     45       char buf[512];
     46       AsmScnGrp_t *grp;
     47       AsmScn_t *scn;
     48       AsmSym_t *sym;
     49 
     50       snprintf (buf, sizeof (buf), ".grp%Zu", cnt);
     51       grp = asm_newscngrp (ctx, buf, NULL, 0);
     52       if (grp == NULL)
     53 	{
     54 	  printf ("cannot section group %Zu: %s\n", cnt, asm_errmsg (-1));
     55 	  asm_abort (ctx);
     56 	  return 1;
     57 	}
     58 
     59       scn = asm_newscn_ingrp (ctx, ".data", SHT_PROGBITS,
     60 			      SHF_ALLOC | SHF_WRITE, grp);
     61       if (scn == NULL)
     62 	{
     63 	  printf ("cannot data section for group %Zu: %s\n",
     64 		  cnt, asm_errmsg (-1));
     65 	  asm_abort (ctx);
     66 	  return 1;
     67 	}
     68 
     69       /* Add a name.  */
     70       snprintf (buf, sizeof (buf), "%Zu", cnt);
     71       sym = asm_newsym (scn, buf, sizeof (uint32_t), STT_OBJECT,
     72 			STB_GLOBAL);
     73       if (sym == NULL)
     74 	{
     75 	  printf ("cannot create symbol \"%s\": %s\n", buf, asm_errmsg (-1));
     76 	  asm_abort (ctx);
     77 	  return 1;
     78 	}
     79 
     80       /* Add some content.  */
     81       if (asm_adduint32 (scn, cnt) != 0)
     82 	{
     83 	  printf ("cannot create content of section \"%s\": %s\n",
     84 		  buf, asm_errmsg (-1));
     85 	  asm_abort (ctx);
     86 	  return 1;
     87 	}
     88 
     89       /* Now we have a symbol, use it as the signature.  */
     90       if (asm_scngrp_newsignature (grp, sym) != 0)
     91 	{
     92 	  printf ("cannot set signature for section group %Zu: %s\n",
     93 		  cnt, asm_errmsg (-1));
     94 	  asm_abort (ctx);
     95 	  return 1;
     96 	}
     97 
     98       /* Create a phony debug info section.  */
     99       scn = asm_newscn_ingrp (ctx, ".stab", SHT_PROGBITS, 0, grp);
    100       if (scn == NULL)
    101 	{
    102 	  printf ("cannot stab section for group %Zu: %s\n",
    103 		  cnt, asm_errmsg (-1));
    104 	  asm_abort (ctx);
    105 	  return 1;
    106 	}
    107 
    108       /* Add some content.  */
    109       if (asm_adduint32 (scn, cnt) != 0)
    110 	{
    111 	  printf ("cannot create content of section \"%s\": %s\n",
    112 		  buf, asm_errmsg (-1));
    113 	  asm_abort (ctx);
    114 	  return 1;
    115 	}
    116     }
    117 
    118   /* Create the output file.  */
    119   if (asm_end (ctx) != 0)
    120     {
    121       printf ("cannot create output file: %s\n", asm_errmsg (-1));
    122       asm_abort (ctx);
    123       return 1;
    124     }
    125 
    126   if (result == 0)
    127     result = WEXITSTATUS (system ("\
    128 env LD_LIBRARY_PATH=../libelf ../src/elflint -q asm-tst6-out.o"));
    129 
    130   /* We don't need the file anymore.  */
    131   unlink (fname);
    132 
    133   return result;
    134 }
    135