am bb7928cc: merge from open-source master
This commit is contained in:
commit
440de73df9
@ -205,8 +205,6 @@ __fremovelock(FILE* fp)
|
|||||||
lock->file = NULL;
|
lock->file = NULL;
|
||||||
}
|
}
|
||||||
lock_table_unlock(t);
|
lock_table_unlock(t);
|
||||||
|
free(lock);
|
||||||
if (lock != NULL)
|
|
||||||
free(lock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,12 +31,14 @@
|
|||||||
char* strndup(const char* s, size_t n)
|
char* strndup(const char* s, size_t n)
|
||||||
{
|
{
|
||||||
size_t slen = (size_t)strlen(s);
|
size_t slen = (size_t)strlen(s);
|
||||||
int len = slen < n ? slen : n;
|
char* copy;
|
||||||
char* copy = malloc(len+1);
|
|
||||||
|
|
||||||
|
if (slen < n)
|
||||||
|
n = slen;
|
||||||
|
copy = malloc(n+1);
|
||||||
if (copy) {
|
if (copy) {
|
||||||
memcpy( copy, s, len );
|
memcpy(copy, s, n);
|
||||||
copy[len] = 0;
|
copy[n] = 0;
|
||||||
}
|
}
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
@ -76,16 +76,16 @@ static char sccsid[] = "@(#)exp.c 8.1 (Berkeley) 6/4/93";
|
|||||||
|
|
||||||
#include "mathimpl.h"
|
#include "mathimpl.h"
|
||||||
|
|
||||||
const static double p1 = 0x1.555555555553ep-3;
|
static const double p1 = 0x1.555555555553ep-3;
|
||||||
const static double p2 = -0x1.6c16c16bebd93p-9;
|
static const double p2 = -0x1.6c16c16bebd93p-9;
|
||||||
const static double p3 = 0x1.1566aaf25de2cp-14;
|
static const double p3 = 0x1.1566aaf25de2cp-14;
|
||||||
const static double p4 = -0x1.bbd41c5d26bf1p-20;
|
static const double p4 = -0x1.bbd41c5d26bf1p-20;
|
||||||
const static double p5 = 0x1.6376972bea4d0p-25;
|
static const double p5 = 0x1.6376972bea4d0p-25;
|
||||||
const static double ln2hi = 0x1.62e42fee00000p-1;
|
static const double ln2hi = 0x1.62e42fee00000p-1;
|
||||||
const static double ln2lo = 0x1.a39ef35793c76p-33;
|
static const double ln2lo = 0x1.a39ef35793c76p-33;
|
||||||
const static double lnhuge = 0x1.6602b15b7ecf2p9;
|
static const double lnhuge = 0x1.6602b15b7ecf2p9;
|
||||||
const static double lntiny = -0x1.77af8ebeae354p9;
|
static const double lntiny = -0x1.77af8ebeae354p9;
|
||||||
const static double invln2 = 0x1.71547652b82fep0;
|
static const double invln2 = 0x1.71547652b82fep0;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
double exp(x)
|
double exp(x)
|
||||||
|
@ -68,7 +68,7 @@ __ieee754_atan2(double y, double x)
|
|||||||
if(((ix|((lx|-lx)>>31))>0x7ff00000)||
|
if(((ix|((lx|-lx)>>31))>0x7ff00000)||
|
||||||
((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */
|
((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */
|
||||||
return x+y;
|
return x+y;
|
||||||
if((hx-0x3ff00000|lx)==0) return atan(y); /* x=1.0 */
|
if(((hx-0x3ff00000) | lx)==0) return atan(y); /* x=1.0 */
|
||||||
m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */
|
m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */
|
||||||
|
|
||||||
/* when y = 0 */
|
/* when y = 0 */
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* e_j0f.c -- float version of e_j0.c.
|
/* e_j0f.c -- float version of e_j0.c.
|
||||||
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
||||||
|
* Bugs in __ieee754_j0f and __ieee754_y0f fixed by Scott Turner 01/16/2010
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -63,7 +64,7 @@ __ieee754_j0f(float x)
|
|||||||
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
|
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
|
||||||
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
|
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
|
||||||
*/
|
*/
|
||||||
if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(x);
|
if(((uint32_t)hx)>0x80000000) z = (invsqrtpi*cc)/sqrtf(x);
|
||||||
else {
|
else {
|
||||||
u = pzerof(x); v = qzerof(x);
|
u = pzerof(x); v = qzerof(x);
|
||||||
z = invsqrtpi*(u*cc-v*ss)/sqrtf(x);
|
z = invsqrtpi*(u*cc-v*ss)/sqrtf(x);
|
||||||
@ -107,7 +108,7 @@ __ieee754_y0f(float x)
|
|||||||
int32_t hx,ix;
|
int32_t hx,ix;
|
||||||
|
|
||||||
GET_FLOAT_WORD(hx,x);
|
GET_FLOAT_WORD(hx,x);
|
||||||
ix = 0x7fffffff&hx;
|
ix = hx&0x7fffffff;
|
||||||
/* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
|
/* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
|
||||||
if(ix>=0x7f800000) return one/(x+x*x);
|
if(ix>=0x7f800000) return one/(x+x*x);
|
||||||
if(ix==0) return -one/zero;
|
if(ix==0) return -one/zero;
|
||||||
@ -137,7 +138,7 @@ __ieee754_y0f(float x)
|
|||||||
if ((s*c)<zero) cc = z/ss;
|
if ((s*c)<zero) cc = z/ss;
|
||||||
else ss = z/cc;
|
else ss = z/cc;
|
||||||
}
|
}
|
||||||
if(ix>0x80000000) z = (invsqrtpi*ss)/sqrtf(x);
|
if(((uint32_t)hx)>0x80000000) z = (invsqrtpi*ss)/sqrtf(x);
|
||||||
else {
|
else {
|
||||||
u = pzerof(x); v = qzerof(x);
|
u = pzerof(x); v = qzerof(x);
|
||||||
z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
|
z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* e_j1f.c -- float version of e_j1.c.
|
/* e_j1f.c -- float version of e_j1.c.
|
||||||
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
||||||
|
* Bug in __ieee754_j1f fixed by Scott Turner 1/16/2010
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -64,7 +65,7 @@ __ieee754_j1f(float x)
|
|||||||
* j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
|
* j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
|
||||||
* y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
|
* y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
|
||||||
*/
|
*/
|
||||||
if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(y);
|
if(((uint32_t)hx)>0x80000000) z = (invsqrtpi*cc)/sqrtf(y);
|
||||||
else {
|
else {
|
||||||
u = ponef(y); v = qonef(y);
|
u = ponef(y); v = qonef(y);
|
||||||
z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
|
z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
|
||||||
|
@ -186,7 +186,7 @@ __ieee754_ynf(int n, float x)
|
|||||||
b = __ieee754_y1f(x);
|
b = __ieee754_y1f(x);
|
||||||
/* quit if b is -inf */
|
/* quit if b is -inf */
|
||||||
GET_FLOAT_WORD(ib,b);
|
GET_FLOAT_WORD(ib,b);
|
||||||
for(i=1;i<n&&ib!=0xff800000;i++){
|
for(i=1; i<n && (((uint32_t)ib) != 0xff800000); i++){
|
||||||
temp = b;
|
temp = b;
|
||||||
b = ((float)(i+i)/x)*b - a;
|
b = ((float)(i+i)/x)*b - a;
|
||||||
GET_FLOAT_WORD(ib,b);
|
GET_FLOAT_WORD(ib,b);
|
||||||
|
@ -59,6 +59,9 @@
|
|||||||
#define LDPATH_BUFSIZE 512
|
#define LDPATH_BUFSIZE 512
|
||||||
#define LDPATH_MAX 8
|
#define LDPATH_MAX 8
|
||||||
|
|
||||||
|
#define LDPRELOAD_BUFSIZE 512
|
||||||
|
#define LDPRELOAD_MAX 8
|
||||||
|
|
||||||
/* >>> IMPORTANT NOTE - READ ME BEFORE MODIFYING <<<
|
/* >>> IMPORTANT NOTE - READ ME BEFORE MODIFYING <<<
|
||||||
*
|
*
|
||||||
* Do NOT use malloc() and friends or pthread_*() code here.
|
* Do NOT use malloc() and friends or pthread_*() code here.
|
||||||
@ -112,6 +115,11 @@ static inline int validate_soinfo(soinfo *si)
|
|||||||
static char ldpaths_buf[LDPATH_BUFSIZE];
|
static char ldpaths_buf[LDPATH_BUFSIZE];
|
||||||
static const char *ldpaths[LDPATH_MAX + 1];
|
static const char *ldpaths[LDPATH_MAX + 1];
|
||||||
|
|
||||||
|
static char ldpreloads_buf[LDPRELOAD_BUFSIZE];
|
||||||
|
static const char *ldpreload_names[LDPRELOAD_MAX + 1];
|
||||||
|
|
||||||
|
static soinfo *preloads[LDPRELOAD_MAX + 1];
|
||||||
|
|
||||||
int debug_verbosity;
|
int debug_verbosity;
|
||||||
static int pid;
|
static int pid;
|
||||||
|
|
||||||
@ -443,6 +451,7 @@ _do_lookup(soinfo *si, const char *name, unsigned *base)
|
|||||||
Elf32_Sym *s;
|
Elf32_Sym *s;
|
||||||
unsigned *d;
|
unsigned *d;
|
||||||
soinfo *lsi = si;
|
soinfo *lsi = si;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Look for symbols in the local scope first (the object who is
|
/* Look for symbols in the local scope first (the object who is
|
||||||
* searching). This happens with C++ templates on i386 for some
|
* searching). This happens with C++ templates on i386 for some
|
||||||
@ -457,6 +466,14 @@ _do_lookup(soinfo *si, const char *name, unsigned *base)
|
|||||||
if(s != NULL)
|
if(s != NULL)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
/* Next, look for it in the preloads list */
|
||||||
|
for(i = 0; preloads[i] != NULL; i++) {
|
||||||
|
lsi = preloads[i];
|
||||||
|
s = _do_lookup_in_so(lsi, name, &elf_hash);
|
||||||
|
if(s != NULL)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
for(d = si->dynamic; *d; d += 2) {
|
for(d = si->dynamic; *d; d += 2) {
|
||||||
if(d[0] == DT_NEEDED){
|
if(d[0] == DT_NEEDED){
|
||||||
lsi = (soinfo *)d[1];
|
lsi = (soinfo *)d[1];
|
||||||
@ -1908,6 +1925,23 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if this is the main executable, then load all of the preloads now */
|
||||||
|
if(si->flags & FLAG_EXE) {
|
||||||
|
int i;
|
||||||
|
memset(preloads, 0, sizeof(preloads));
|
||||||
|
for(i = 0; ldpreload_names[i] != NULL; i++) {
|
||||||
|
soinfo *lsi = find_library(ldpreload_names[i]);
|
||||||
|
if(lsi == 0) {
|
||||||
|
strlcpy(tmp_err_buf, linker_get_error(), sizeof(tmp_err_buf));
|
||||||
|
DL_ERR("%5d could not load needed library '%s' for '%s' (%s)",
|
||||||
|
pid, ldpreload_names[i], si->name, tmp_err_buf);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
lsi->refcount++;
|
||||||
|
preloads[i] = lsi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(d = si->dynamic; *d; d += 2) {
|
for(d = si->dynamic; *d; d += 2) {
|
||||||
if(d[0] == DT_NEEDED){
|
if(d[0] == DT_NEEDED){
|
||||||
DEBUG("%5d %s needs %s\n", pid, si->name, si->strtab + d[1]);
|
DEBUG("%5d %s needs %s\n", pid, si->name, si->strtab + d[1]);
|
||||||
@ -2024,6 +2058,30 @@ static void parse_library_path(char *path, char *delim)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_preloads(char *path, char *delim)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *ldpreloads_bufp = ldpreloads_buf;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
len = strlcpy(ldpreloads_buf, path, sizeof(ldpreloads_buf));
|
||||||
|
|
||||||
|
while (i < LDPRELOAD_MAX && (ldpreload_names[i] = strsep(&ldpreloads_bufp, delim))) {
|
||||||
|
if (*ldpreload_names[i] != '\0') {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forget the last path if we had to truncate; this occurs if the 2nd to
|
||||||
|
* last char isn't '\0' (i.e. not originally a delim). */
|
||||||
|
if (i > 0 && len >= sizeof(ldpreloads_buf) &&
|
||||||
|
ldpreloads_buf[sizeof(ldpreloads_buf) - 2] != '\0') {
|
||||||
|
ldpreload_names[i - 1] = NULL;
|
||||||
|
} else {
|
||||||
|
ldpreload_names[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -2043,6 +2101,7 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
soinfo *si;
|
soinfo *si;
|
||||||
struct link_map * map;
|
struct link_map * map;
|
||||||
char *ldpath_env = NULL;
|
char *ldpath_env = NULL;
|
||||||
|
char *ldpreload_env = NULL;
|
||||||
|
|
||||||
/* Setup a temporary TLS area that is used to get a working
|
/* Setup a temporary TLS area that is used to get a working
|
||||||
* errno for system calls.
|
* errno for system calls.
|
||||||
@ -2074,6 +2133,8 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
debug_verbosity = atoi(((char*) vecs[0]) + 6);
|
debug_verbosity = atoi(((char*) vecs[0]) + 6);
|
||||||
} else if(!strncmp((char*) vecs[0], "LD_LIBRARY_PATH=", 16)) {
|
} else if(!strncmp((char*) vecs[0], "LD_LIBRARY_PATH=", 16)) {
|
||||||
ldpath_env = (char*) vecs[0] + 16;
|
ldpath_env = (char*) vecs[0] + 16;
|
||||||
|
} else if(!strncmp((char*) vecs[0], "LD_PRELOAD=", 11)) {
|
||||||
|
ldpreload_env = (char*) vecs[0] + 11;
|
||||||
}
|
}
|
||||||
vecs++;
|
vecs++;
|
||||||
}
|
}
|
||||||
@ -2137,6 +2198,10 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
if (ldpath_env && getuid() == geteuid() && getgid() == getegid())
|
if (ldpath_env && getuid() == geteuid() && getgid() == getegid())
|
||||||
parse_library_path(ldpath_env, ":");
|
parse_library_path(ldpath_env, ":");
|
||||||
|
|
||||||
|
if (ldpreload_env && getuid() == geteuid() && getgid() == getegid()) {
|
||||||
|
parse_preloads(ldpreload_env, " :");
|
||||||
|
}
|
||||||
|
|
||||||
if(link_image(si, 0)) {
|
if(link_image(si, 0)) {
|
||||||
char errmsg[] = "CANNOT LINK EXECUTABLE\n";
|
char errmsg[] = "CANNOT LINK EXECUTABLE\n";
|
||||||
write(2, __linker_dl_err_buf, strlen(__linker_dl_err_buf));
|
write(2, __linker_dl_err_buf, strlen(__linker_dl_err_buf));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user