Blame elf/vismain.c

Packit Service 82fcde
/* Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
/* This file must be compiled as PIE to avoid copy relocation when
Packit Service 82fcde
   accessing protected symbols defined in shared libaries since copy
Packit Service 82fcde
   relocation doesn't work with protected symbols and linker in
Packit Service 82fcde
   binutils 2.26 enforces this rule.  */
Packit Service 82fcde
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
Packit Service 82fcde
#include "vismod.h"
Packit Service 82fcde
Packit Service 82fcde
/* Prototype for our test function.  */
Packit Service 82fcde
extern int do_test (void);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* This defines the `main' function and some more.  */
Packit Service 82fcde
#include <support/test-driver.c>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Prototypes for local functions.  */
Packit Service 82fcde
extern int protlocal (void);
Packit Service 82fcde
Packit Service 82fcde
const char *protvarlocal = __FILE__;
Packit Service 82fcde
extern const char *protvarinmod;
Packit Service 82fcde
extern const char *protvaritcpt;
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int res = 0;
Packit Service 82fcde
  int val;
Packit Service 82fcde
Packit Service 82fcde
  /* First test: check whether .protected is handled correctly by the
Packit Service 82fcde
     assembler/linker.  The uses of `protlocal' in the DSOs and in the
Packit Service 82fcde
     main program should all be resolved with the local definitions.  */
Packit Service 82fcde
  val = protlocal () + calllocal1 () + calllocal2 ();
Packit Service 82fcde
  if (val != 0x155)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("\
Packit Service 82fcde
The handling of `.protected' seems to be implemented incorrectly: giving up");
Packit Service 82fcde
      abort ();
Packit Service 82fcde
    }
Packit Service 82fcde
  puts ("`.protected' seems to be handled correctly, good!");
Packit Service 82fcde
Packit Service 82fcde
  /* Function pointers: for functions which are marked local and for
Packit Service 82fcde
     which definitions are available all function pointers must be
Packit Service 82fcde
     distinct.  */
Packit Service 82fcde
  if (protlocal == getlocal1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protlocal' in main and mod1 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (protlocal == getlocal2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protlocal' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getlocal1 () == getlocal2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protlocal' in mod1 and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getlocal1 () () + getlocal2 () () != 0x44)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("pointers to `protlocal' in mod1 or mod2 incorrect");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Next test.  This is similar to the last one but the function we
Packit Service 82fcde
     are calling is not defined in the main object.  This means that
Packit Service 82fcde
     the invocation in the main object uses the definition in the
Packit Service 82fcde
     first DSO.  */
Packit Service 82fcde
  if (protinmod != getinmod1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("&protinmod in main (%p) != &protinmod in mod1 (%p)\n",
Packit Service 82fcde
	      protinmod, getinmod1 ());
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (protinmod == getinmod2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protinmod' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getinmod1 () == getinmod2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protinmod' in mod1 and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (protinmod () + getinmod1 () () + getinmod2 () () != 0x4800)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("pointers to `protinmod' in mod1 or mod2 incorrect");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  val = protinmod () + callinmod1 () + callinmod2 ();
Packit Service 82fcde
  if (val != 0x15800)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("calling of `protinmod' leads to wrong result (%#x)\n", val);
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* A very similar text.  Same setup for the main object and the modules
Packit Service 82fcde
     but this time we have another definition in a preloaded module. This
Packit Service 82fcde
     one intercepts the references from the main object.  */
Packit Service 82fcde
  if (protitcpt != getitcpt3 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("&protitcpt in main (%p) != &protitcpt in mod3 (%p)\n",
Packit Service 82fcde
	      &protitcpt, getitcpt3 ());
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (protitcpt == getitcpt1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protitcpt' in main and mod1 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (protitcpt == getitcpt2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protitcpt' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getitcpt1 () == getitcpt2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protitcpt' in mod1 and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  val = protitcpt () + getitcpt1 () () + getitcpt2 () () + getitcpt3 () ();
Packit Service 82fcde
  if (val != 0x8440000)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
pointers to `protitcpt' in mod1 or mod2 or mod3 incorrect (%#x)\n", val);
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  val = protitcpt () + callitcpt1 () + callitcpt2 () + callitcpt3 ();
Packit Service 82fcde
  if (val != 0x19540000)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("calling of `protitcpt' leads to wrong result (%#x)\n", val);
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Now look at variables.  First a variable which is available
Packit Service 82fcde
     everywhere.  We must have three different addresses.  */
Packit Service 82fcde
  if (&protvarlocal == getvarlocal1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvarlocal' in main and mod1 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (&protvarlocal == getvarlocal2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvarlocal' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getvarlocal1 () == getvarlocal2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvarlocal' in mod1 and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (protvarlocal, __FILE__) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvarlocal in main has wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvarlocal1 (), "vismod1.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvarlocal1' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvarlocal2 (), "vismod2.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvarlocal2' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Now the case where there is no local definition.  */
Packit Service 82fcde
  if (&protvarinmod != getvarinmod1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("&protvarinmod in main (%p) != &protitcpt in mod1 (%p)\n",
Packit Service 82fcde
	      &protvarinmod, getvarinmod1 ());
Packit Service 82fcde
      // XXX Possibly enable once fixed.
Packit Service 82fcde
      // res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (&protvarinmod == getvarinmod2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvarinmod' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvarinmod1 (), "vismod1.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvarinmod1' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvarinmod2 (), "vismod2.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvarinmod2' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* And a test where a variable definition is intercepted.  */
Packit Service 82fcde
  if (&protvaritcpt == getvaritcpt1 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvaritcpt' in main and mod1 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (&protvaritcpt == getvaritcpt2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvaritcpt' in main and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (&protvaritcpt != getvaritcpt3 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("&protvaritcpt in main (%p) != &protvaritcpt in mod3 (%p)\n",
Packit Service 82fcde
	      &protvaritcpt, getvaritcpt3 ());
Packit Service 82fcde
      // XXX Possibly enable once fixed.
Packit Service 82fcde
      // res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (getvaritcpt1 () == getvaritcpt2 ())
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvaritcpt' in mod1 and mod2 have same address");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (protvaritcpt, "vismod3.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`protvaritcpt in main has wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvaritcpt1 (), "vismod1.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvaritcpt1' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (strcmp (*getvaritcpt2 (), "vismod2.c") != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("`getvaritcpt2' returns wrong value");
Packit Service 82fcde
      res = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return res;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
protlocal (void)
Packit Service 82fcde
{
Packit Service 82fcde
  return 0x1;
Packit Service 82fcde
}