NetBSD-5.0.2/libexec/ld.aout_so/arch/arm32/md-static-funcs.c

Compare this file to the similar file:
Show the results in this format:

/*	$NetBSD: md-static-funcs.c,v 1.1 1997/10/17 21:25:42 mark Exp $	*/

/*
 * Copyright (C) 1997 Mark Brinicombe
 * Copyright (C) 1997 Causality Limited
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Causality Limited.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Called by ld.so when onanating.
 * This *must* be a static function, so it is not called through a jmpslot.
 */

#define RELOC_32	0x04
#define RELOC_JMPSLOT	0x06	/* See note below */
#define RELOC_GOT32	0x24

/*
 * The value is RELOC_JMPSLOT is special. Really it should be 0x46 i.e.
 * have the r_jmptable bit set however due to the usage of the
 * relocation bits outside the linker the r_jmptable is only used
 * internal to the linker and thus this bit get lost when the
 * relocations are written out.
 */

static void
md_relocate_simple(r, relocation, addr)
	struct relocation_info	*r;
	long			relocation;
	char			*addr;
{
	int index;

	index = r->r_pcrel | (r->r_length << 1) | (r->r_extern << 3)
	    | (r->r_neg << 4) | (r->r_baserel << 5);

	if (index == RELOC_JMPSLOT)
		*(long *)addr += relocation;
	else if (index == RELOC_GOT32)
		*(long *)addr += relocation;
	else if (index == RELOC_32)
		*(long *)addr += relocation;

/*	if (r->r_relative)
		*(long *)addr += relocation;*/
}