Merge ^/head r339813 through r340125.
This commit is contained in:
commit
2a22df74e9
@ -183,7 +183,7 @@ CROSS_BINUTILS_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
|
||||
# support the target architecture), provide a default cross-binutils prefix.
|
||||
# This allows riscv64 builds, for example, to automatically use the
|
||||
# riscv64-binutils port or package.
|
||||
.if !make(showconfig)
|
||||
.if !make(showconfig) && !defined(_NO_INCLUDE_COMPILERMK)
|
||||
.if !empty(BROKEN_OPTIONS:MBINUTILS_BOOTSTRAP) && \
|
||||
${MK_LLD_BOOTSTRAP} == "no" && \
|
||||
!defined(CROSS_BINUTILS_PREFIX)
|
||||
@ -950,7 +950,7 @@ _worldtmp: .PHONY
|
||||
.else
|
||||
${_+_}@if [ -e "${WORLDTMP}" ]; then \
|
||||
echo ">>> Deleting stale files in build tree..."; \
|
||||
cd ${.CURDIR}; ${WMAKE} -DBATCH_DELETE_OLD_FILES \
|
||||
cd ${.CURDIR}; ${WMAKE} -DBATCH_DELETE_OLD_FILES _NO_INCLUDE_COMPILERMK=t \
|
||||
delete-old delete-old-libs >/dev/null; \
|
||||
fi
|
||||
rm -rf ${WORLDTMP}/legacy/usr/include
|
||||
@ -1003,19 +1003,21 @@ _cleanobj:
|
||||
@echo "--------------------------------------------------------------"
|
||||
@echo ">>> stage 2.1: cleaning up the object tree"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR}
|
||||
# Avoid including bsd.compiler.mk in clean and obj with _NO_INCLUDE_COMPILERMK
|
||||
# since the restricted $PATH might not contain a valid cc binary
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t ${CLEANDIR}
|
||||
.if defined(LIBCOMPAT)
|
||||
${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} -f Makefile.inc1 ${CLEANDIR}
|
||||
${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} _NO_INCLUDE_COMPILERMK=t -f Makefile.inc1 ${CLEANDIR}
|
||||
.endif
|
||||
.else
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} _cleanobj_fast_depend_hack
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t _cleanobj_fast_depend_hack
|
||||
.endif # !defined(NO_CLEAN)
|
||||
_obj:
|
||||
@echo
|
||||
@echo "--------------------------------------------------------------"
|
||||
@echo ">>> stage 2.2: rebuilding the object tree"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} obj
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t obj
|
||||
_build-tools:
|
||||
@echo
|
||||
@echo "--------------------------------------------------------------"
|
||||
|
@ -200,7 +200,8 @@ build${libcompat}: .PHONY
|
||||
OBJTOP=${LIBCOMPAT_OBJTOP} \
|
||||
OBJROOT='$${OBJTOP}/' \
|
||||
MAKEOBJDIRPREFIX= \
|
||||
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
||||
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS \
|
||||
MK_CTF=no MK_RETPOLINE=no MK_WARNS=no \
|
||||
${_t}
|
||||
.endfor
|
||||
.endfor
|
||||
|
@ -174,6 +174,8 @@ OLD_FILES+=usr/lib/clang/6.0.1/lib/freebsd/libclang_rt.ubsan_standalone_cxx-x86_
|
||||
OLD_DIRS+=usr/lib/clang/6.0.1/lib/freebsd
|
||||
OLD_DIRS+=usr/lib/clang/6.0.1/lib
|
||||
OLD_DIRS+=usr/lib/clang/6.0.1
|
||||
# 20181030: malloc_domain(9) KPI change
|
||||
OLD_FILES+=share/man/man9/malloc_domain.9.gz
|
||||
# 20181026: joy(4) removal
|
||||
OLD_FILES+=usr/share/man/man4/joy.4.gz
|
||||
# 20181025: OpenSSL libraries version bump to avoid conflict with ports
|
||||
|
@ -88,7 +88,7 @@ getgname(gid_t gid)
|
||||
* contained in struct stat
|
||||
*/
|
||||
static acl_t
|
||||
acl_from_stat(struct stat sb)
|
||||
acl_from_stat(const struct stat *sb)
|
||||
{
|
||||
acl_t acl;
|
||||
acl_entry_t entry;
|
||||
@ -111,13 +111,13 @@ acl_from_stat(struct stat sb)
|
||||
return NULL;
|
||||
|
||||
/* calculate user mode */
|
||||
if (sb.st_mode & S_IRUSR)
|
||||
if (sb->st_mode & S_IRUSR)
|
||||
if (acl_add_perm(perms, ACL_READ) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IWUSR)
|
||||
if (sb->st_mode & S_IWUSR)
|
||||
if (acl_add_perm(perms, ACL_WRITE) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IXUSR)
|
||||
if (sb->st_mode & S_IXUSR)
|
||||
if (acl_add_perm(perms, ACL_EXECUTE) == -1)
|
||||
return NULL;
|
||||
if (acl_set_permset(entry, perms) == -1)
|
||||
@ -135,13 +135,13 @@ acl_from_stat(struct stat sb)
|
||||
return NULL;
|
||||
|
||||
/* calculate group mode */
|
||||
if (sb.st_mode & S_IRGRP)
|
||||
if (sb->st_mode & S_IRGRP)
|
||||
if (acl_add_perm(perms, ACL_READ) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IWGRP)
|
||||
if (sb->st_mode & S_IWGRP)
|
||||
if (acl_add_perm(perms, ACL_WRITE) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IXGRP)
|
||||
if (sb->st_mode & S_IXGRP)
|
||||
if (acl_add_perm(perms, ACL_EXECUTE) == -1)
|
||||
return NULL;
|
||||
if (acl_set_permset(entry, perms) == -1)
|
||||
@ -159,13 +159,13 @@ acl_from_stat(struct stat sb)
|
||||
return NULL;
|
||||
|
||||
/* calculate other mode */
|
||||
if (sb.st_mode & S_IROTH)
|
||||
if (sb->st_mode & S_IROTH)
|
||||
if (acl_add_perm(perms, ACL_READ) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IWOTH)
|
||||
if (sb->st_mode & S_IWOTH)
|
||||
if (acl_add_perm(perms, ACL_WRITE) == -1)
|
||||
return NULL;
|
||||
if (sb.st_mode & S_IXOTH)
|
||||
if (sb->st_mode & S_IXOTH)
|
||||
if (acl_add_perm(perms, ACL_EXECUTE) == -1)
|
||||
return NULL;
|
||||
if (acl_set_permset(entry, perms) == -1)
|
||||
@ -229,7 +229,7 @@ print_acl(char *path, acl_type_t type, int hflag, int iflag, int nflag,
|
||||
errno = 0;
|
||||
if (type == ACL_TYPE_DEFAULT)
|
||||
return(0);
|
||||
acl = acl_from_stat(sb);
|
||||
acl = acl_from_stat(&sb);
|
||||
if (!acl) {
|
||||
warn("%s: acl_from_stat() failed", path);
|
||||
return(-1);
|
||||
|
19
bin/ps/ps.1
19
bin/ps/ps.1
@ -29,7 +29,7 @@
|
||||
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd March 13, 2018
|
||||
.Dd October 31, 2018
|
||||
.Dt PS 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -346,7 +346,7 @@ the include file
|
||||
.It Dv "P_HWPMC" Ta No "0x800000" Ta "Process is using HWPMCs"
|
||||
.It Dv "P_JAILED" Ta No "0x1000000" Ta "Process is in jail"
|
||||
.It Dv "P_TOTAL_STOP" Ta No "0x2000000" Ta "Stopped for system suspend"
|
||||
.It Dv "P_INEXEC" Ta No "0x4000000" Ta "Process is in execve()"
|
||||
.It Dv "P_INEXEC" Ta No "0x4000000" Ta Process is in Xr execve 2
|
||||
.It Dv "P_STATCHILD" Ta No "0x8000000" Ta "Child process stopped or exited"
|
||||
.It Dv "P_INMEM" Ta No "0x10000000" Ta "Loaded into memory"
|
||||
.It Dv "P_SWAPPINGOUT" Ta No "0x20000000" Ta "Process is being swapped out"
|
||||
@ -361,8 +361,8 @@ the include file
|
||||
.In sys/proc.h :
|
||||
.Bl -column P2_INHERIT_PROTECTED 0x00000001
|
||||
.It Dv "P2_INHERIT_PROTECTED" Ta No "0x00000001" Ta "New children get P_PROTECTED"
|
||||
.It Dv "P2_NOTRACE" Ta No "0x00000002" Ta "No ptrace(2) attach or coredumps"
|
||||
.It Dv "P2_NOTRACE_EXEC" Ta No "0x00000004" Ta "Keep P2_NOPTRACE on exec(2)"
|
||||
.It Dv "P2_NOTRACE" Ta No "0x00000002" Ta "No" Xr ptrace 2 attach or coredumps
|
||||
.It Dv "P2_NOTRACE_EXEC" Ta No "0x00000004" Ta Keep P2_NOPTRACE on Xr execve 2
|
||||
.It Dv "P2_AST_SU" Ta No "0x00000008" Ta "Handles SU ast for kthreads"
|
||||
.It Dv "P2_PTRACE_FSTP" Ta No "0x00000010" Ta "SIGSTOP from PT_ATTACH not yet handled"
|
||||
.El
|
||||
@ -453,8 +453,7 @@ Marks a process which is in
|
||||
The hostname of the prison can be found in
|
||||
.Pa /proc/ Ns Ao Ar pid Ac Ns Pa /status .
|
||||
.It Li L
|
||||
The process has pages locked in core (for example, for raw
|
||||
.Tn I/O ) .
|
||||
The process has pages locked in core (for example, for raw I/O).
|
||||
.It Li N
|
||||
The process has reduced CPU scheduling priority (see
|
||||
.Xr setpriority 2 ) .
|
||||
@ -553,9 +552,11 @@ data size (in Kbytes)
|
||||
system-call emulation environment (ABI)
|
||||
.It Cm etime
|
||||
elapsed running time, format
|
||||
.Do
|
||||
.Op days- Ns
|
||||
.Op hours: Ns
|
||||
minutes:seconds.
|
||||
.Op hours\&: Ns
|
||||
minutes:seconds
|
||||
.Dc
|
||||
.It Cm etimes
|
||||
elapsed running time, in decimal integer seconds
|
||||
.It Cm fib
|
||||
@ -750,6 +751,8 @@ attempts to automatically determine the terminal width.
|
||||
.It Pa /boot/kernel/kernel
|
||||
default system namelist
|
||||
.El
|
||||
.Sh EXIT STATUS
|
||||
.Ex -std
|
||||
.Sh EXAMPLES
|
||||
Display information on all system processes:
|
||||
.Pp
|
||||
|
@ -468,7 +468,8 @@ evalredir(union node *n, int flags)
|
||||
popredir();
|
||||
if (e == EXERROR || e == EXEXEC) {
|
||||
if (in_redirect) {
|
||||
exitstatus = 2;
|
||||
if (e == EXERROR)
|
||||
exitstatus = 2;
|
||||
FORCEINTON;
|
||||
return;
|
||||
}
|
||||
@ -669,8 +670,10 @@ evalbackcmd(union node *n, struct backcmd *result)
|
||||
forcelocal++;
|
||||
savehandler = handler;
|
||||
if (setjmp(jmploc.loc)) {
|
||||
if (exception == EXERROR || exception == EXEXEC)
|
||||
if (exception == EXERROR)
|
||||
exitstatus = 2;
|
||||
else if (exception == EXEXEC)
|
||||
/* nothing */;
|
||||
else if (exception != 0) {
|
||||
handler = savehandler;
|
||||
forcelocal--;
|
||||
@ -1089,7 +1092,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
|
||||
e = exception;
|
||||
if (e == EXINT)
|
||||
exitstatus = SIGINT+128;
|
||||
else if (e != EXEXIT)
|
||||
else if (e != EXEXEC && e != EXEXIT)
|
||||
exitstatus = 2;
|
||||
goto cmddone;
|
||||
}
|
||||
|
@ -91,7 +91,6 @@ struct tblentry {
|
||||
|
||||
static struct tblentry *cmdtable[CMDTABLESIZE];
|
||||
static int cmdtable_cd = 0; /* cmdtable contains cd-dependent entries */
|
||||
int exerrno = 0; /* Last exec error */
|
||||
|
||||
|
||||
static void tryexec(char *, char **, char **);
|
||||
@ -135,10 +134,10 @@ shellexec(char **argv, char **envp, const char *path, int idx)
|
||||
|
||||
/* Map to POSIX errors */
|
||||
if (e == ENOENT || e == ENOTDIR) {
|
||||
exerrno = 127;
|
||||
exitstatus = 127;
|
||||
exerror(EXEXEC, "%s: not found", argv[0]);
|
||||
} else {
|
||||
exerrno = 126;
|
||||
exitstatus = 126;
|
||||
exerror(EXEXEC, "%s: %s", argv[0], strerror(e));
|
||||
}
|
||||
}
|
||||
|
@ -61,8 +61,6 @@ struct cmdentry {
|
||||
#define DO_ERR 0x01 /* prints errors */
|
||||
#define DO_NOFUNC 0x02 /* don't return shell functions, for command */
|
||||
|
||||
extern int exerrno; /* last exec error */
|
||||
|
||||
void shellexec(char **, char **, const char *, int) __dead2;
|
||||
char *padvance(const char **, const char **, const char *);
|
||||
void find_command(const char *, struct cmdentry *, int, const char *);
|
||||
|
@ -73,6 +73,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include "mystring.h"
|
||||
#include "var.h"
|
||||
#include "builtins.h"
|
||||
#include "eval.h"
|
||||
|
||||
|
||||
/*
|
||||
@ -1005,7 +1006,7 @@ vforkexecshell(struct job *jp, char **argv, char **envp, const char *path, int i
|
||||
if (pid == 0) {
|
||||
TRACE(("Child shell %d\n", (int)getpid()));
|
||||
if (setjmp(jmploc.loc))
|
||||
_exit(exception == EXEXEC ? exerrno : 2);
|
||||
_exit(exception == EXEXEC ? exitstatus : 2);
|
||||
if (pip != NULL) {
|
||||
close(pip[0]);
|
||||
if (pip[1] != 1) {
|
||||
|
@ -106,10 +106,6 @@ main(int argc, char *argv[])
|
||||
state = 0;
|
||||
if (setjmp(main_handler.loc)) {
|
||||
switch (exception) {
|
||||
case EXEXEC:
|
||||
exitstatus = exerrno;
|
||||
break;
|
||||
|
||||
case EXERROR:
|
||||
exitstatus = 2;
|
||||
break;
|
||||
|
@ -20,7 +20,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 16, 2018
|
||||
.Dd October 30, 2018
|
||||
.Dt DTRACE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -778,7 +778,6 @@ Invalid command line options or arguments were specified.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr cpp 1 ,
|
||||
.Xr dtruss 1 ,
|
||||
.Xr elf 5 ,
|
||||
.Xr SDT 9
|
||||
.Rs
|
||||
|
@ -402,6 +402,8 @@ elftc_reloc_type_str(unsigned int mach, unsigned int type)
|
||||
case 22: return "R_MIPS_GOT_HI16";
|
||||
case 23: return "R_MIPS_GOT_LO16";
|
||||
case 24: return "R_MIPS_SUB";
|
||||
case 28: return "R_MIPS_HIGHER";
|
||||
case 29: return "R_MIPS_HIGHEST";
|
||||
case 30: return "R_MIPS_CALLHI16";
|
||||
case 31: return "R_MIPS_CALLLO16";
|
||||
case 37: return "R_MIPS_JALR";
|
||||
|
@ -1121,6 +1121,7 @@ note_type_freebsd(unsigned int nt)
|
||||
case 1: return "NT_FREEBSD_ABI_TAG";
|
||||
case 2: return "NT_FREEBSD_NOINIT_TAG";
|
||||
case 3: return "NT_FREEBSD_ARCH_TAG";
|
||||
case 4: return "NT_FREEBSD_FEATURE_CTL";
|
||||
default: return (note_type_unknown(nt));
|
||||
}
|
||||
}
|
||||
|
@ -64,6 +64,9 @@ ATF_TC_HEAD(mktime_negyear, tc)
|
||||
|
||||
ATF_TC_BODY(mktime_negyear, tc)
|
||||
{
|
||||
#ifdef __FreeBSD__
|
||||
atf_tc_expect_fail("needs work");
|
||||
#endif
|
||||
struct tm tms;
|
||||
time_t t;
|
||||
|
||||
|
@ -103,6 +103,7 @@ static struct {
|
||||
const char *name;
|
||||
long offs;
|
||||
} zt[] = {
|
||||
#ifndef __FreeBSD__
|
||||
{ "Z", 0 },
|
||||
{ "UT", 0 },
|
||||
{ "UTC", 0 },
|
||||
@ -173,6 +174,7 @@ static struct {
|
||||
{ "EST4EDT", -14400 },
|
||||
|
||||
{ "Bogus", -1 },
|
||||
#endif
|
||||
};
|
||||
|
||||
static void
|
||||
@ -188,9 +190,11 @@ ztest1(const char *name, const char *fmt, long value)
|
||||
value = 0;
|
||||
|
||||
switch (value) {
|
||||
#ifndef __FreeBSD__
|
||||
case -2:
|
||||
value = -timezone;
|
||||
break;
|
||||
#endif
|
||||
case -1:
|
||||
if (fmt[1] == 'Z')
|
||||
value = 0;
|
||||
@ -210,9 +214,11 @@ static void
|
||||
ztest(const char *fmt)
|
||||
{
|
||||
setenv("TZ", "US/Eastern", 1);
|
||||
#ifndef __FreeBSD__
|
||||
ztest1("GMT", fmt, 0);
|
||||
ztest1("UTC", fmt, 0);
|
||||
ztest1("US/Eastern", fmt, -18000);
|
||||
#endif
|
||||
for (size_t i = 0; i < __arraycount(zt); i++)
|
||||
ztest1(zt[i].name, fmt, zt[i].offs);
|
||||
}
|
||||
@ -228,10 +234,6 @@ ATF_TC_HEAD(common, tc)
|
||||
ATF_TC_BODY(common, tc)
|
||||
{
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
atf_tc_expect_fail("There are various issues with strptime on FreeBSD");
|
||||
#endif
|
||||
|
||||
h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %T %Y",
|
||||
24, 46, 27, 23, 20, 0, 98, 2, 19);
|
||||
h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %H:%M:%S %Y",
|
||||
@ -305,6 +307,10 @@ ATF_TC_BODY(day, tc)
|
||||
#else
|
||||
h_pass("SaturDay", "%OA", 8, -1, -1, -1, -1, -1, -1, 6, -1);
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
h_fail("00", "%d");
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC(hour);
|
||||
@ -313,7 +319,11 @@ ATF_TC_HEAD(hour, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr",
|
||||
#ifdef __FreeBSD__
|
||||
"Checks strptime(3) hour conversions [HIkl]");
|
||||
#else
|
||||
"Checks strptime(3) hour conversions [IH]");
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC_BODY(hour, tc)
|
||||
@ -322,6 +332,21 @@ ATF_TC_BODY(hour, tc)
|
||||
h_fail("00", "%I");
|
||||
h_fail("13", "%I");
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
h_pass("0", "%k", 1, -1, -1, 0, -1, -1, -1, -1, -1);
|
||||
h_pass("04", "%k", 2, -1, -1, 4, -1, -1, -1, -1, -1);
|
||||
h_pass(" 8", "%k", 2, -1, -1, 8, -1, -1, -1, -1, -1);
|
||||
h_pass("23", "%k", 2, -1, -1, 23, -1, -1, -1, -1, -1);
|
||||
h_fail("24", "%k");
|
||||
|
||||
h_fail("0", "%l");
|
||||
h_pass("1", "%l", 1, -1, -1, 1, -1, -1, -1, -1, -1);
|
||||
h_pass("05", "%l", 2, -1, -1, 5, -1, -1, -1, -1, -1);
|
||||
h_pass(" 9", "%l", 2, -1, -1, 9, -1, -1, -1, -1, -1);
|
||||
h_pass("12", "%l", 2, -1, -1, 12, -1, -1, -1, -1, -1);
|
||||
h_fail("13", "%l");
|
||||
#endif
|
||||
|
||||
h_pass("00", "%H", 2, -1, -1, 0, -1, -1, -1, -1, -1);
|
||||
h_pass("12", "%H", 2, -1, -1, 12, -1, -1, -1, -1, -1);
|
||||
h_pass("23", "%H", 2, -1, -1, 23, -1, -1, -1, -1, -1);
|
||||
@ -413,7 +438,18 @@ ATF_TC_BODY(seconds, tc)
|
||||
h_pass("0", "%S", 1, 0, -1, -1, -1, -1, -1, -1, -1);
|
||||
h_pass("59", "%S", 2, 59, -1, -1, -1, -1, -1, -1, -1);
|
||||
h_pass("60", "%S", 2, 60, -1, -1, -1, -1, -1, -1, -1);
|
||||
#ifdef __FreeBSD__
|
||||
/*
|
||||
* (Much) older versions of the standard (up to the Issue 6) allowed for
|
||||
* [0;61] range in %S conversion for double-leap seconds, and it's
|
||||
* apparently what NetBSD and glibc are expecting, however current
|
||||
* version defines allowed values to be [0;60], and that is what our
|
||||
* strptime() implementation expects.
|
||||
*/
|
||||
h_fail("61", "%S");
|
||||
#else
|
||||
h_pass("61", "%S", 2, 61, -1, -1, -1, -1, -1, -1, -1);
|
||||
#endif
|
||||
h_fail("62", "%S");
|
||||
}
|
||||
|
||||
@ -434,7 +470,9 @@ ATF_TC_BODY(year, tc)
|
||||
h_pass("x2084y", "x%C%yy", 6, -1, -1, -1, -1, -1, 184, -1, -1);
|
||||
h_pass("x8420y", "x%y%Cy", 6, -1, -1, -1, -1, -1, 184, -1, -1);
|
||||
h_pass("%20845", "%%%C%y5", 6, -1, -1, -1, -1, -1, 184, -1, -1);
|
||||
#ifndef __FreeBSD__
|
||||
h_fail("%", "%E%");
|
||||
#endif
|
||||
|
||||
h_pass("1980", "%Y", 4, -1, -1, -1, -1, -1, 80, -1, -1);
|
||||
h_pass("1980", "%EY", 4, -1, -1, -1, -1, -1, 80, -1, -1);
|
||||
@ -467,7 +505,7 @@ ATF_TC_HEAD(Zone, tc)
|
||||
|
||||
ATF_TC_BODY(Zone, tc)
|
||||
{
|
||||
ztest("%z");
|
||||
ztest("%Z");
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
|
@ -1177,10 +1177,14 @@ int main(int argc, char *argv[])
|
||||
cb->server = -1;
|
||||
cb->state = IDLE;
|
||||
cb->size = 64;
|
||||
cb->sin.ss_family = PF_INET;
|
||||
cb->port = htobe16(7174);
|
||||
sem_init(&cb->sem, 0, 0);
|
||||
|
||||
/* initialize sockaddr structure with defaults */
|
||||
ret = get_addr("0.0.0.0", (struct sockaddr *) &cb->sin);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
opterr = 0;
|
||||
while ((op=getopt(argc, argv, "a:I:Pp:C:S:t:scvVd")) != -1) {
|
||||
switch (op) {
|
||||
|
@ -352,9 +352,13 @@ Patterns are arbitrary Boolean combinations
|
||||
of regular expressions and
|
||||
relational expressions.
|
||||
Regular expressions are as in
|
||||
.IR egrep ;
|
||||
see
|
||||
.IR grep (1).
|
||||
.IR egrep (1)
|
||||
except numeric quantifiers are not supported beyond the basic
|
||||
.B +
|
||||
and
|
||||
.B ?
|
||||
for quantities \&\f(CW"0 or 1"\fP and \&\f(CW"1 or more"\fP
|
||||
respectively.
|
||||
Isolated regular expressions
|
||||
in a pattern apply to the entire line.
|
||||
Regular expressions may also occur in
|
||||
|
@ -1,6 +1,6 @@
|
||||
.\" $Id: mount_smbfs.8,v 1.10 2002/04/16 02:47:41 bp Exp $
|
||||
.\" $FreeBSD$
|
||||
.Dd September 17, 2011
|
||||
.Dd November 1, 2018
|
||||
.Dt MOUNT_SMBFS 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -8,12 +8,12 @@
|
||||
.Nd "mount a shared resource from an SMB file server"
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl E Ar cs1 : Ns Ar cs2
|
||||
.Op Fl E Ar cs1 Ns Cm \&: Ns Ar cs2
|
||||
.Op Fl I Ar host
|
||||
.Op Fl L Ar locale
|
||||
.Op Fl M Ar crights : Ns Ar srights
|
||||
.Op Fl M Ar crights Ns Cm \&: Ns Ar srights
|
||||
.Op Fl N
|
||||
.Op Fl O Ar cowner : Ns Ar cgroup Ns / Ns Ar sowner : Ns Ar sgroup
|
||||
.Op Fl O Ar cowner Ns Cm \&: Ns Ar cgroup Ns Cm \&/ Ns Ar sowner Ns Cm \&: Ns Ar sgroup
|
||||
.Op Fl R Ar retrycount
|
||||
.Op Fl T Ar timeout
|
||||
.Op Fl U Ar username
|
||||
@ -25,9 +25,9 @@
|
||||
.Op Fl n Ar opt
|
||||
.Op Fl u Ar uid
|
||||
.Sm off
|
||||
.No // Ar user No @ Ar server
|
||||
.Op Ar :port1 Op Ar :port2
|
||||
.No / Ar share
|
||||
.Cm \&// Ns Ar user Cm \&@ Ar server
|
||||
.Op Cm \&: Ar port1 Op Cm \&: Ar port2
|
||||
.Cm \&/ Ar share
|
||||
.Sm on
|
||||
.Ar node
|
||||
.Sh DESCRIPTION
|
||||
@ -37,7 +37,7 @@ command mounts a share from a remote server using SMB/CIFS protocol.
|
||||
.Pp
|
||||
The options are as follows:
|
||||
.Bl -tag -width indent
|
||||
.It Fl E Ar cs1 : Ns Ar cs2
|
||||
.It Fl E Ar cs1 Ns Cm \&: Ns Ar cs2
|
||||
Specifies local
|
||||
.Pq Ar cs1
|
||||
and server's
|
||||
@ -57,7 +57,7 @@ By default,
|
||||
tries to use an environment variable
|
||||
.Ev LC_*
|
||||
to determine it.
|
||||
.It Fl M Ar crights : Ns Ar srights
|
||||
.It Fl M Ar crights Ns Cm \&: Ns Ar srights
|
||||
Assign access rights to the newly created connection.
|
||||
.It Fl N
|
||||
Do not ask for a password.
|
||||
@ -69,7 +69,7 @@ file for additional configuration parameters and a password.
|
||||
If no password is found,
|
||||
.Nm
|
||||
prompts for it.
|
||||
.It Fl O Ar cowner : Ns Ar cgroup Ns / Ns Ar sowner : Ns Ar sgroup
|
||||
.It Fl O Ar cowner Ns Cm \&: Ns Ar cgroup Ns Cm \&/ Ns Ar sowner Ns Cm \&: Ns Ar sgroup
|
||||
Assign owner/group attributes to the newly created connection.
|
||||
.It Fl R Ar retrycount
|
||||
How many retries should be done before the SMB requester decides to drop
|
||||
@ -111,7 +111,7 @@ server.
|
||||
User ID and group ID assigned to files.
|
||||
The default are owner and group IDs from
|
||||
the directory where the volume is mounted.
|
||||
.It No // Ns Ar user Ns @ Ns Ar server Ns Oo Ar :port1 Ns Oo Ar :port2 Oc Oc Ns No / Ns Ar share
|
||||
.It Cm \&// Ns Ar user Ns Cm \&@ Ns Ar server Ns Oo Cm \&: Ns Ar port1 Ns Oo Cm \&: Ns Ar port2 Oc Oc Ns Cm \&/ Ns Ar share
|
||||
The
|
||||
.Nm
|
||||
command will use
|
||||
@ -136,22 +136,24 @@ are 137.
|
||||
Path to mount point.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width ".Pa ~/.nsmbrc" -compact
|
||||
.Bl -tag -width ".Pa /etc/nsmb.conf" -compact
|
||||
.It Pa ~/.nsmbrc
|
||||
Keeps static parameters for connections and other information.
|
||||
Keeps user-specific static parameters for connections and other information.
|
||||
See
|
||||
.Pa /usr/share/examples/smbfs/dot.nsmbrc
|
||||
for details.
|
||||
.It Pa /etc/nsmb.conf
|
||||
Keeps system-wide static parameters for connections and other information.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
The following example illustrates how to connect to SMB server
|
||||
.Em SAMBA
|
||||
.Dq SAMBA
|
||||
as user
|
||||
.Em GUEST ,
|
||||
.Dq GUEST ,
|
||||
and mount shares
|
||||
.Em PUBLIC
|
||||
.Dq PUBLIC
|
||||
and
|
||||
.Em TMP :
|
||||
.Dq TMP :
|
||||
.Bd -literal -offset indent
|
||||
mount_smbfs -I samba.mydomain.com //guest@samba/public /smb/public
|
||||
mount_smbfs -I 192.168.20.3 -E koi8-r:cp866 //guest@samba/tmp /smb/tmp
|
||||
@ -159,9 +161,43 @@ mount_smbfs -I 192.168.20.3 -E koi8-r:cp866 //guest@samba/tmp /smb/tmp
|
||||
.Pp
|
||||
It is also possible to use
|
||||
.Xr fstab 5
|
||||
for smbfs mounts (the example below doesn't prompt for a password):
|
||||
for smbfs mounts (the example below does not prompt for a password):
|
||||
.Pp
|
||||
.Dl "//guest@samba/public /smb/public smbfs rw,noauto,-N 0 0"
|
||||
.Sh SEE ALSO
|
||||
.Xr smbutil 1 ,
|
||||
.Xr nsmb.conf 5
|
||||
.Pp
|
||||
Other resources:
|
||||
.Bl -dash -compact
|
||||
.It
|
||||
Chapter dedicated to Samba configuration in the
|
||||
.Fx
|
||||
Handbook:
|
||||
.Lk "https://www.freebsd.org/doc/handbook/network-samba.html"
|
||||
.El
|
||||
.Sh STANDARDS
|
||||
.Nm
|
||||
offers support for SMB/CIFS/SMB1.
|
||||
It does not support newer versions of the protocol like SMB2 and SMB3.
|
||||
SMB2 and SMB3 are supported by software available in the
|
||||
.Xr ports 7
|
||||
collection.
|
||||
.Pp
|
||||
The list of supported SMB servers includes:
|
||||
.Bl -dash -compact
|
||||
.It
|
||||
Samba
|
||||
.It
|
||||
Windows 95/98/ME/2000/NT4.0 (SPs 4, 5, 6)
|
||||
.It
|
||||
IBM LanManager
|
||||
.It
|
||||
NetApp
|
||||
.El
|
||||
.Sh HISTORY
|
||||
SMB/CIFS protocol and SMB/CIFS file system implementation first appeared in
|
||||
.Fx 4.5 .
|
||||
.Sh AUTHORS
|
||||
.An Boris Popov Aq bp@butya.kz ,
|
||||
.Aq bp@FreeBSD.org
|
||||
|
@ -1,5 +1,5 @@
|
||||
.\" $Id: smbutil.1,v 1.5 2002/04/16 02:48:16 bp Exp $
|
||||
.Dd February 14, 2000
|
||||
.Dd November 1, 2018
|
||||
.Dt SMBUTIL 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -127,6 +127,9 @@ See
|
||||
.Pa ./examples/dot.nsmbrc
|
||||
for details.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr nsmb.conf 5 ,
|
||||
.Xr mount_smbfs 8
|
||||
.Sh AUTHORS
|
||||
.An Boris Popov Aq bp@butya.kz ,
|
||||
.Aq bp@FreeBSD.org
|
||||
|
@ -390,7 +390,6 @@ register const int doextend;
|
||||
res = -1;
|
||||
sp->goback = sp->goahead = FALSE;
|
||||
|
||||
/* XXX The following is from OpenBSD, and I'm not sure it is correct */
|
||||
if (name != NULL && issetugid() != 0)
|
||||
if ((name[0] == ':' && name[1] == '/') ||
|
||||
name[0] == '/' || strchr(name, '.'))
|
||||
@ -398,7 +397,6 @@ register const int doextend;
|
||||
if (name == NULL && (name = TZDEFAULT) == NULL)
|
||||
return -1;
|
||||
{
|
||||
int doaccess;
|
||||
struct stat stab;
|
||||
/*
|
||||
** Section 4.9.1 of the C standard says that
|
||||
@ -415,8 +413,7 @@ register const int doextend;
|
||||
|
||||
if (name[0] == ':')
|
||||
++name;
|
||||
doaccess = name[0] == '/';
|
||||
if (!doaccess) {
|
||||
if (name[0] != '/') {
|
||||
if ((p = TZDIR) == NULL) {
|
||||
free(fullname);
|
||||
return -1;
|
||||
@ -428,17 +425,8 @@ register const int doextend;
|
||||
(void) strcpy(fullname, p);
|
||||
(void) strcat(fullname, "/");
|
||||
(void) strcat(fullname, name);
|
||||
/*
|
||||
** Set doaccess if '.' (as in "../") shows up in name.
|
||||
*/
|
||||
if (strchr(name, '.') != NULL)
|
||||
doaccess = TRUE;
|
||||
name = fullname;
|
||||
}
|
||||
if (doaccess && access(name, R_OK) != 0) {
|
||||
free(fullname);
|
||||
return -1;
|
||||
}
|
||||
if ((fid = _open(name, OPEN_MODE)) == -1) {
|
||||
free(fullname);
|
||||
return -1;
|
||||
|
@ -1,5 +1,40 @@
|
||||
News for the tz database
|
||||
|
||||
Release 2018g - 2018-10-26 22:22:45 -0700
|
||||
|
||||
Briefly:
|
||||
Morocco switches to permanent +01 on 2018-10-27.
|
||||
|
||||
Changes to future timestamps
|
||||
|
||||
Morocco switches from +00/+01 to permanent +01 effective 2018-10-27,
|
||||
so its clocks will not fall back on 2018-10-28 as previously scheduled.
|
||||
(Thanks to Mohamed Essedik Najd and Brian Inglis.)
|
||||
|
||||
Changes to code
|
||||
|
||||
When generating TZif files with leap seconds, zic no longer uses a
|
||||
format that trips up older 32-bit clients, fixing a bug introduced
|
||||
in 2018f. (Reported by Daniel Fischer.) Also, the zic workaround
|
||||
for QTBUG-53071 now also works for TZif files with leap seconds.
|
||||
|
||||
The translator to rearguard format now rewrites the line
|
||||
"Rule Japan 1948 1951 - Sep Sat>=8 25:00 0 S" to
|
||||
"Rule Japan 1948 1951 - Sep Sun>=9 1:00 0 S".
|
||||
This caters to zic before 2007 and to Oracle TZUpdater 2.2.0
|
||||
and earlier. (Reported by Christos Zoulas.)
|
||||
|
||||
Changes to past time zone abbreviations
|
||||
|
||||
Change HDT to HWT/HPT for WWII-era abbreviations in Hawaii.
|
||||
This reverts to 2011h, as the abbreviation change in 2011i was
|
||||
likely inadvertent.
|
||||
|
||||
Changes to documentation
|
||||
|
||||
tzfile.5 has new sections on interoperability issues.
|
||||
|
||||
|
||||
Release 2018f - 2018-10-18 00:14:18 -0700
|
||||
|
||||
Briefly:
|
||||
|
@ -844,94 +844,61 @@ Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
|
||||
# <https://lnt.ma/le-maroc-reculera-dune-heure-le-dimanche-14-juin/> agrees
|
||||
# with the patch.
|
||||
|
||||
# From Paul Eggert (2015-06-08):
|
||||
# For now, guess that later spring and fall transitions will use 2015's rules,
|
||||
# and guess that Morocco will switch to standard time at 03:00 the last
|
||||
# Sunday before Ramadan, and back to DST at 02:00 the first Sunday after
|
||||
# Ramadan. To implement this, transition dates for 2016 through 2037 were
|
||||
# determined by running the following program under GNU Emacs 24.3, with the
|
||||
# results integrated by hand into the table below.
|
||||
# (let ((islamic-year 1437))
|
||||
# (require 'cal-islam)
|
||||
# (while (< islamic-year 1460)
|
||||
# (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year)))
|
||||
# (b (calendar-islamic-to-absolute (list 10 1 islamic-year)))
|
||||
# (sunday 0))
|
||||
# (while (/= sunday (mod (setq a (1- a)) 7)))
|
||||
# (while (/= sunday (mod b 7))
|
||||
# (setq b (1+ b)))
|
||||
# (setq a (calendar-gregorian-from-absolute a))
|
||||
# (setq b (calendar-gregorian-from-absolute b))
|
||||
# (insert
|
||||
# (format
|
||||
# (concat "Rule\tMorocco\t%d\tonly\t-\t%s\t%2d\t 3:00\t0\t-\n"
|
||||
# "Rule\tMorocco\t%d\tonly\t-\t%s\t%2d\t 2:00\t1:00\tS\n")
|
||||
# (car (cdr (cdr a))) (calendar-month-name (car a) t) (car (cdr a))
|
||||
# (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b)))))
|
||||
# (setq islamic-year (+ 1 islamic-year))))
|
||||
# From Mohamed Essedik Najd (2018-10-26):
|
||||
# Today, a Moroccan government council approved the perpetual addition
|
||||
# of 60 minutes to the regular Moroccan timezone.
|
||||
# From Brian Inglis (2018-10-26):
|
||||
# http://www.maroc.ma/fr/actualites/le-conseil-de-gouvernement-adopte-un-projet-de-decret-relatif-lheure-legale-stipulant-le
|
||||
|
||||
# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
|
||||
Rule Morocco 1939 only - Sep 12 0:00 1:00 S
|
||||
Rule Morocco 1939 only - Sep 12 0:00 1:00 -
|
||||
Rule Morocco 1939 only - Nov 19 0:00 0 -
|
||||
Rule Morocco 1940 only - Feb 25 0:00 1:00 S
|
||||
Rule Morocco 1940 only - Feb 25 0:00 1:00 -
|
||||
Rule Morocco 1945 only - Nov 18 0:00 0 -
|
||||
Rule Morocco 1950 only - Jun 11 0:00 1:00 S
|
||||
Rule Morocco 1950 only - Jun 11 0:00 1:00 -
|
||||
Rule Morocco 1950 only - Oct 29 0:00 0 -
|
||||
Rule Morocco 1967 only - Jun 3 12:00 1:00 S
|
||||
Rule Morocco 1967 only - Jun 3 12:00 1:00 -
|
||||
Rule Morocco 1967 only - Oct 1 0:00 0 -
|
||||
Rule Morocco 1974 only - Jun 24 0:00 1:00 S
|
||||
Rule Morocco 1974 only - Jun 24 0:00 1:00 -
|
||||
Rule Morocco 1974 only - Sep 1 0:00 0 -
|
||||
Rule Morocco 1976 1977 - May 1 0:00 1:00 S
|
||||
Rule Morocco 1976 1977 - May 1 0:00 1:00 -
|
||||
Rule Morocco 1976 only - Aug 1 0:00 0 -
|
||||
Rule Morocco 1977 only - Sep 28 0:00 0 -
|
||||
Rule Morocco 1978 only - Jun 1 0:00 1:00 S
|
||||
Rule Morocco 1978 only - Jun 1 0:00 1:00 -
|
||||
Rule Morocco 1978 only - Aug 4 0:00 0 -
|
||||
Rule Morocco 2008 only - Jun 1 0:00 1:00 S
|
||||
Rule Morocco 2008 only - Jun 1 0:00 1:00 -
|
||||
Rule Morocco 2008 only - Sep 1 0:00 0 -
|
||||
Rule Morocco 2009 only - Jun 1 0:00 1:00 S
|
||||
Rule Morocco 2009 only - Jun 1 0:00 1:00 -
|
||||
Rule Morocco 2009 only - Aug 21 0:00 0 -
|
||||
Rule Morocco 2010 only - May 2 0:00 1:00 S
|
||||
Rule Morocco 2010 only - May 2 0:00 1:00 -
|
||||
Rule Morocco 2010 only - Aug 8 0:00 0 -
|
||||
Rule Morocco 2011 only - Apr 3 0:00 1:00 S
|
||||
Rule Morocco 2011 only - Apr 3 0:00 1:00 -
|
||||
Rule Morocco 2011 only - Jul 31 0:00 0 -
|
||||
Rule Morocco 2012 2013 - Apr lastSun 2:00 1:00 S
|
||||
Rule Morocco 2012 2013 - Apr lastSun 2:00 1:00 -
|
||||
Rule Morocco 2012 only - Jul 20 3:00 0 -
|
||||
Rule Morocco 2012 only - Aug 20 2:00 1:00 S
|
||||
Rule Morocco 2012 only - Aug 20 2:00 1:00 -
|
||||
Rule Morocco 2012 only - Sep 30 3:00 0 -
|
||||
Rule Morocco 2013 only - Jul 7 3:00 0 -
|
||||
Rule Morocco 2013 only - Aug 10 2:00 1:00 S
|
||||
Rule Morocco 2013 max - Oct lastSun 3:00 0 -
|
||||
Rule Morocco 2014 2021 - Mar lastSun 2:00 1:00 S
|
||||
Rule Morocco 2013 only - Aug 10 2:00 1:00 -
|
||||
Rule Morocco 2013 2018 - Oct lastSun 3:00 0 -
|
||||
Rule Morocco 2014 2018 - Mar lastSun 2:00 1:00 -
|
||||
Rule Morocco 2014 only - Jun 28 3:00 0 -
|
||||
Rule Morocco 2014 only - Aug 2 2:00 1:00 S
|
||||
Rule Morocco 2014 only - Aug 2 2:00 1:00 -
|
||||
Rule Morocco 2015 only - Jun 14 3:00 0 -
|
||||
Rule Morocco 2015 only - Jul 19 2:00 1:00 S
|
||||
Rule Morocco 2015 only - Jul 19 2:00 1:00 -
|
||||
Rule Morocco 2016 only - Jun 5 3:00 0 -
|
||||
Rule Morocco 2016 only - Jul 10 2:00 1:00 S
|
||||
Rule Morocco 2016 only - Jul 10 2:00 1:00 -
|
||||
Rule Morocco 2017 only - May 21 3:00 0 -
|
||||
Rule Morocco 2017 only - Jul 2 2:00 1:00 S
|
||||
Rule Morocco 2017 only - Jul 2 2:00 1:00 -
|
||||
Rule Morocco 2018 only - May 13 3:00 0 -
|
||||
Rule Morocco 2018 only - Jun 17 2:00 1:00 S
|
||||
Rule Morocco 2019 only - May 5 3:00 0 -
|
||||
Rule Morocco 2019 only - Jun 9 2:00 1:00 S
|
||||
Rule Morocco 2020 only - Apr 19 3:00 0 -
|
||||
Rule Morocco 2020 only - May 24 2:00 1:00 S
|
||||
Rule Morocco 2021 only - Apr 11 3:00 0 -
|
||||
Rule Morocco 2021 only - May 16 2:00 1:00 S
|
||||
Rule Morocco 2022 only - May 8 2:00 1:00 S
|
||||
Rule Morocco 2023 only - Apr 23 2:00 1:00 S
|
||||
Rule Morocco 2024 only - Apr 14 2:00 1:00 S
|
||||
Rule Morocco 2025 only - Apr 6 2:00 1:00 S
|
||||
Rule Morocco 2026 max - Mar lastSun 2:00 1:00 S
|
||||
Rule Morocco 2036 only - Oct 19 3:00 0 -
|
||||
Rule Morocco 2037 only - Oct 4 3:00 0 -
|
||||
Rule Morocco 2018 only - Jun 17 2:00 1:00 -
|
||||
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
|
||||
0:00 Morocco WE%sT 1984 Mar 16
|
||||
1:00 - CET 1986
|
||||
0:00 Morocco WE%sT
|
||||
0:00 Morocco +00/+01 1984 Mar 16
|
||||
1:00 - +01 1986
|
||||
0:00 Morocco +00/+01 2018 Oct 27
|
||||
1:00 - +01
|
||||
|
||||
# Western Sahara
|
||||
#
|
||||
@ -946,7 +913,8 @@ Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
|
||||
|
||||
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
|
||||
-1:00 - -01 1976 Apr 14
|
||||
0:00 Morocco WE%sT
|
||||
0:00 Morocco +00/+01 2018 Oct 27
|
||||
1:00 - +01
|
||||
|
||||
# Mozambique
|
||||
#
|
||||
|
@ -3440,7 +3440,8 @@ Rule Spain 1978 only - Oct 1 2:00s 0 -
|
||||
#Rule NatSpain 1937 only - May 22 23:00 1:00 S
|
||||
#Rule NatSpain 1937 1938 - Oct Sat>=1 24:00s 0 -
|
||||
#Rule NatSpain 1938 only - Mar 26 23:00 1:00 S
|
||||
# The following rules are copied from Morocco from 1967 through 1978.
|
||||
# The following rules are copied from Morocco from 1967 through 1978,
|
||||
# except with "S" letters.
|
||||
Rule SpainAfrica 1967 only - Jun 3 12:00 1:00 S
|
||||
Rule SpainAfrica 1967 only - Oct 1 0:00 0 -
|
||||
Rule SpainAfrica 1974 only - Jun 24 0:00 1:00 S
|
||||
|
@ -439,6 +439,19 @@ Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53
|
||||
# western South Dakota, far western Texas (El Paso County, Hudspeth County,
|
||||
# and Pine Springs and Nickel Creek in Culberson County), Utah, Wyoming
|
||||
#
|
||||
# From Paul Eggert (2018-10-25):
|
||||
# On 1921-03-04 federal law placed all of Texas into the central time zone.
|
||||
# However, El Paso ignored the law for decades and continued to observe
|
||||
# mountain time, on the grounds that that's what they had always done
|
||||
# and they weren't about to let the federal government tell them what to do.
|
||||
# Eventually the federal government gave in and changed the law on
|
||||
# 1970-04-10 to match what El Paso was actually doing. Although
|
||||
# that's slightly after our 1970 cutoff, there is no need to create a
|
||||
# separate zone for El Paso since they were ignoring the law anyway. See:
|
||||
# Long T. El Pasoans were time rebels, fought to stay in Mountain zone.
|
||||
# El Paso Times. 2018-10-24 06:40 -06.
|
||||
# https://www.elpasotimes.com/story/news/local/el-paso/2018/10/24/el-pasoans-were-time-rebels-fought-stay-mountain-zone/1744509002/
|
||||
#
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
|
||||
Rule Denver 1920 1921 - Mar lastSun 2:00 1:00 D
|
||||
Rule Denver 1920 only - Oct lastSun 2:00 0 S
|
||||
@ -708,9 +721,7 @@ Zone America/Adak 12:13:22 - LMT 1867 Oct 19 12:44:35
|
||||
Zone Pacific/Honolulu -10:31:26 - LMT 1896 Jan 13 12:00
|
||||
-10:30 - HST 1933 Apr 30 2:00
|
||||
-10:30 1:00 HDT 1933 May 21 12:00
|
||||
-10:30 - HST 1942 Feb 9 2:00
|
||||
-10:30 1:00 HDT 1945 Sep 30 2:00
|
||||
-10:30 - HST 1947 Jun 8 2:00
|
||||
-10:30 US H%sT 1947 Jun 8 2:00
|
||||
-10:00 - HST
|
||||
|
||||
# Now we turn to US areas that have diverged from the consensus since 1970.
|
||||
|
@ -407,7 +407,7 @@ in decreasing order of importance:
|
||||
EST/EDT/EWT/EPT/EDDT Eastern [North America],
|
||||
EET/EEST Eastern European,
|
||||
GST Guam,
|
||||
HST/HDT Hawaii,
|
||||
HST/HDT/HWT/HPT Hawaii,
|
||||
HKT/HKST Hong Kong,
|
||||
IST India,
|
||||
IST/GMT Irish,
|
||||
|
@ -1 +1 @@
|
||||
2018f
|
||||
2018g
|
||||
|
@ -80,6 +80,13 @@ DATAFORM != "main" {
|
||||
if (comment_out) {
|
||||
sub(/^/, "#")
|
||||
}
|
||||
|
||||
# In rearguard format, change the Japan rule line with "Sat>=8 25:00"
|
||||
# to "Sun>=9 1:00", to cater to zic before 2007 and to older Java.
|
||||
if (!vanguard && $1 == "Rule" && $7 == "Sat>=8" && $8 == "25:00") {
|
||||
sub(/Sat>=8/, "Sun>=9")
|
||||
sub(/25:00/, " 1:00")
|
||||
}
|
||||
}
|
||||
|
||||
# If a Link line is followed by a Zone line for the same data, comment
|
||||
|
@ -172,11 +172,6 @@ function process_input_line(line, field, end, i, n, startdef)
|
||||
if (line ~ /^R /) return
|
||||
line = substr(line, 1, RSTART) substr(line, RSTART + 5)
|
||||
}
|
||||
# Replace SpainAfrica rules with Morocco, as they are duplicates.
|
||||
if (match(line, / SpainAfrica /)) {
|
||||
if (line ~ /^R /) return
|
||||
line = substr(line, 1, RSTART) "Morocco" substr(line, RSTART + RLENGTH - 1)
|
||||
}
|
||||
|
||||
# Abbreviate times.
|
||||
while (match(line, /[: ]0+[0-9]/))
|
||||
|
@ -664,6 +664,9 @@
|
||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
||||
#define RETSIGTYPE void
|
||||
|
||||
/* if REUSEPORT is enabled by default */
|
||||
#define REUSEPORT_DEFAULT 0
|
||||
|
||||
/* default rootkey location */
|
||||
#define ROOT_ANCHOR_FILE "/var/unbound/root.key"
|
||||
|
||||
|
@ -663,6 +663,9 @@
|
||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
||||
#undef RETSIGTYPE
|
||||
|
||||
/* if REUSEPORT is enabled by default */
|
||||
#undef REUSEPORT_DEFAULT
|
||||
|
||||
/* default rootkey location */
|
||||
#undef ROOT_ANCHOR_FILE
|
||||
|
||||
|
11
contrib/unbound/configure
vendored
11
contrib/unbound/configure
vendored
@ -15966,6 +15966,17 @@ fi
|
||||
done
|
||||
|
||||
|
||||
# check if we can use SO_REUSEPORT
|
||||
if echo "$host" | grep -i -e linux -e dragonfly >/dev/null; then
|
||||
|
||||
$as_echo "#define REUSEPORT_DEFAULT 1" >>confdefs.h
|
||||
|
||||
else
|
||||
|
||||
$as_echo "#define REUSEPORT_DEFAULT 0" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
# set memory allocation checking if requested
|
||||
# Check whether --enable-alloc-checks was given.
|
||||
if test "${enable_alloc_checks+set}" = set; then :
|
||||
|
@ -461,6 +461,13 @@ ACX_CHECK_NONBLOCKING_BROKEN
|
||||
ACX_MKDIR_ONE_ARG
|
||||
AC_CHECK_FUNCS([strptime],[AC_CHECK_STRPTIME_WORKS],[AC_LIBOBJ([strptime])])
|
||||
|
||||
# check if we can use SO_REUSEPORT
|
||||
if echo "$host" | grep -i -e linux -e dragonfly >/dev/null; then
|
||||
AC_DEFINE(REUSEPORT_DEFAULT, 1, [if REUSEPORT is enabled by default])
|
||||
else
|
||||
AC_DEFINE(REUSEPORT_DEFAULT, 0, [if REUSEPORT is enabled by default])
|
||||
fi
|
||||
|
||||
# set memory allocation checking if requested
|
||||
AC_ARG_ENABLE(alloc-checks, AC_HELP_STRING([--enable-alloc-checks],
|
||||
[ enable to memory allocation statistics, for debug purposes ]),
|
||||
|
@ -177,7 +177,7 @@ config_create(void)
|
||||
cfg->if_automatic = 0;
|
||||
cfg->so_rcvbuf = 0;
|
||||
cfg->so_sndbuf = 0;
|
||||
cfg->so_reuseport = 1;
|
||||
cfg->so_reuseport = REUSEPORT_DEFAULT;
|
||||
cfg->ip_transparent = 0;
|
||||
cfg->ip_freebind = 0;
|
||||
cfg->num_ifs = 0;
|
||||
|
60
etc/Makefile
60
etc/Makefile
@ -4,6 +4,8 @@
|
||||
.include <src.opts.mk>
|
||||
|
||||
FILESGROUPS= FILES
|
||||
NLS_ALIASES= POSIX C \
|
||||
en_US.US_ASCII C
|
||||
|
||||
# No need as it is empty and just causes rebuilds since this file does so much.
|
||||
UPDATE_DEPENDFILE= no
|
||||
@ -157,42 +159,34 @@ distrib-cleanup: .PHONY
|
||||
done
|
||||
|
||||
distrib-dirs: ${MTREES:N/*} distrib-cleanup .PHONY
|
||||
@set ${MTREES}; \
|
||||
while test $$# -ge 2; do \
|
||||
m=${.CURDIR}/$$1; \
|
||||
shift; \
|
||||
d=${DESTDIR}$$1; \
|
||||
shift; \
|
||||
test -d $$d || mkdir -p $$d; \
|
||||
${ECHO} ${MTREE_CMD} -deU ${MTREE_FSCHG} \
|
||||
${MTREE_FOLLOWS_SYMLINKS} -f $$m -p $$d; \
|
||||
${MTREE_FILTER} $$m | \
|
||||
${MTREE_CMD} -deU ${MTREE_FSCHG} ${MTREE_FOLLOWS_SYMLINKS} \
|
||||
-p $$d; \
|
||||
done; true
|
||||
.for _m _d in ${MTREES}
|
||||
@m=${.CURDIR}/${_m}; \
|
||||
d=${DESTDIR}${_d}; \
|
||||
test -d $$d || mkdir -p $$d; \
|
||||
${ECHO} ${MTREE_CMD} -deU ${MTREE_FSCHG} \
|
||||
${MTREE_FOLLOWS_SYMLINKS} -f $$m -p $$d; \
|
||||
${MTREE_FILTER} $$m | \
|
||||
${MTREE_CMD} -deU ${MTREE_FSCHG} ${MTREE_FOLLOWS_SYMLINKS} \
|
||||
-p $$d
|
||||
.endfor
|
||||
.if defined(NO_ROOT)
|
||||
@set ${MTREES}; \
|
||||
while test $$# -ge 2; do \
|
||||
m=${.CURDIR}/$$1; \
|
||||
shift; \
|
||||
d=$$1; \
|
||||
test "$$d" == "/" && d=""; \
|
||||
d=${DISTBASE}$$d; \
|
||||
shift; \
|
||||
test -d ${DESTDIR}/$$d || mkdir -p ${DESTDIR}/$$d; \
|
||||
${ECHO} "${MTREE_CMD:N-W} -C -f $$m -K all | " \
|
||||
"sed s#^\.#.$$d# | ${METALOG.add}" ; \
|
||||
${MTREE_FILTER} $$m | \
|
||||
${MTREE_CMD:N-W} -C -K all | sed s#^\.#.$$d# | \
|
||||
${METALOG.add} ; \
|
||||
done; true
|
||||
.for _m _d in ${MTREES}
|
||||
@m=${.CURDIR}/${_m}; \
|
||||
d=${_d}; \
|
||||
test "$$d" == "/" && d=""; \
|
||||
d=${DISTBASE}$$d; \
|
||||
test -d ${DESTDIR}/$$d || mkdir -p ${DESTDIR}/$$d; \
|
||||
${ECHO} "${MTREE_CMD:N-W} -C -f $$m -K all | " \
|
||||
"sed s#^\.#.$$d# | ${METALOG.add}" ; \
|
||||
${MTREE_FILTER} $$m | \
|
||||
${MTREE_CMD:N-W} -C -K all | sed s#^\.#.$$d# | \
|
||||
${METALOG.add}
|
||||
.endfor
|
||||
.endif
|
||||
.if ${MK_NLS} != "no"
|
||||
set - `grep "^[a-zA-Z]" ${.CURDIR}/nls.alias`; \
|
||||
while [ $$# -gt 0 ] ; do \
|
||||
${INSTALL_SYMLINK} "$$2" "${DESTDIR}${SHAREDIR}/nls/$$1"; \
|
||||
shift; shift; \
|
||||
done
|
||||
.for alias nls in ${NLS_ALIASES}
|
||||
${INSTALL_SYMLINK} "${nls}" "${DESTDIR}${SHAREDIR}/nls/${alias}"
|
||||
.endfor
|
||||
.endif
|
||||
|
||||
etc-examples: ${META_DEPS}
|
||||
|
@ -270,6 +270,14 @@
|
||||
test-programs
|
||||
..
|
||||
..
|
||||
csu
|
||||
dynamic
|
||||
..
|
||||
dynamiclib
|
||||
..
|
||||
static
|
||||
..
|
||||
..
|
||||
libarchive
|
||||
..
|
||||
libc
|
||||
|
@ -1,4 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
POSIX C
|
||||
en_US.US-ASCII C
|
@ -8,10 +8,7 @@ SUBDIR+= ${MACHINE_ARCH}
|
||||
SUBDIR+= ${MACHINE_CPUARCH}
|
||||
.endif
|
||||
|
||||
.if ${MACHINE_ARCH} == "aarch64" || ${MACHINE_ARCH} == "amd64" || \
|
||||
${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "powerpc64"
|
||||
HAS_TESTS=
|
||||
SUBDIR.${MK_TESTS}+= tests
|
||||
.endif
|
||||
|
||||
.include <bsd.subdir.mk>
|
||||
|
2
lib/csu/arm/crt.h
Normal file
2
lib/csu/arm/crt.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* $FreeBSD$ */
|
||||
/* Empty so we can include this unconditionally */
|
@ -45,10 +45,10 @@ void *__dso_handle = 0;
|
||||
#ifdef HAVE_CTORS
|
||||
static void __do_global_dtors_aux(void) __used;
|
||||
|
||||
crt_func __CTOR_LIST__[] __section(".ctors") __hidden = {
|
||||
static crt_func __CTOR_LIST__[] __section(".ctors") __used = {
|
||||
(crt_func)-1
|
||||
};
|
||||
crt_func __DTOR_LIST__[] __section(".dtors") __hidden = {
|
||||
static crt_func __DTOR_LIST__[] __section(".dtors") __used = {
|
||||
(crt_func)-1
|
||||
};
|
||||
|
||||
@ -81,7 +81,7 @@ asm (
|
||||
extern void _Jv_RegisterClasses(void *) __weak_symbol;
|
||||
static void register_classes(void) __used;
|
||||
|
||||
crt_func __JCR_LIST__[] __section(".jcr") __used __hidden = { };
|
||||
static crt_func __JCR_LIST__[] __section(".jcr") __used = { };
|
||||
|
||||
#ifndef CTORS_CONSTRUCTORS
|
||||
__attribute__((constructor))
|
||||
|
@ -35,10 +35,10 @@ typedef void (*crt_func)(void);
|
||||
*/
|
||||
static void __do_global_ctors_aux(void) __used;
|
||||
|
||||
crt_func __CTOR_END__[] __section(".ctors") __used __hidden = {
|
||||
static crt_func __CTOR_END__[] __section(".ctors") __used = {
|
||||
(crt_func)0
|
||||
};
|
||||
crt_func __DTOR_END__[] __section(".dtors") __used __hidden = {
|
||||
static crt_func __DTOR_END__[] __section(".dtors") __used = {
|
||||
(crt_func)0
|
||||
};
|
||||
|
||||
|
31
lib/csu/mips/crt.h
Normal file
31
lib/csu/mips/crt.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-1-Clause
|
||||
*
|
||||
* Copyright 2018 Andrew Turner
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _CRT_H_
|
||||
#define _CRT_H_
|
||||
|
||||
#define HAVE_CTORS
|
||||
|
||||
#endif
|
33
lib/csu/powerpc/crt.h
Normal file
33
lib/csu/powerpc/crt.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-1-Clause
|
||||
*
|
||||
* Copyright 2018 Andrew Turner
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _CRT_H_
|
||||
#define _CRT_H_
|
||||
|
||||
#define HAVE_CTORS
|
||||
#define CTORS_CONSTRUCTORS
|
||||
#define INIT_CALL_SEQ(func) "bl " __STRING(func) "; nop"
|
||||
|
||||
#endif
|
2
lib/csu/riscv/crt.h
Normal file
2
lib/csu/riscv/crt.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* $FreeBSD$ */
|
||||
/* Empty so we can include this unconditionally */
|
31
lib/csu/sparc64/crt.h
Normal file
31
lib/csu/sparc64/crt.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-1-Clause
|
||||
*
|
||||
* Copyright 2018 Andrew Turner
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _CRT_H_
|
||||
#define _CRT_H_
|
||||
|
||||
#define HAVE_CTORS
|
||||
|
||||
#endif
|
@ -1,6 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= dso
|
||||
TESTS_SUBDIRS= dynamic
|
||||
TESTS_SUBDIRS+= dynamiclib
|
||||
TESTS_SUBDIRS+= static
|
||||
|
||||
.include <bsd.test.mk>
|
||||
|
@ -4,7 +4,7 @@ ATF_TESTS_C+= init_test
|
||||
ATF_TESTS_C+= fini_test
|
||||
ATF_TESTS_CXX+= cxx_constructors
|
||||
|
||||
WARNS?= 5
|
||||
WARNS?= 3
|
||||
|
||||
.if exists(${.CURDIR:H:H}/${MACHINE_ARCH})
|
||||
CFLAGS+= -I${.CURDIR:H:H}/${MACHINE_ARCH}
|
||||
|
@ -39,10 +39,18 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef DSO_LIB
|
||||
#include <atf-c++.hpp>
|
||||
#endif
|
||||
|
||||
extern volatile int constructor_run;
|
||||
extern bool run_destructor_test;
|
||||
|
||||
#ifndef DSO_BASE
|
||||
volatile int constructor_run;
|
||||
bool run_destructor_test = false;
|
||||
#endif
|
||||
|
||||
static volatile int constructor_run;
|
||||
static bool run_destructor_test = false;
|
||||
struct Foo {
|
||||
Foo() {
|
||||
constructor_run = 1;
|
||||
@ -53,8 +61,12 @@ struct Foo {
|
||||
}
|
||||
};
|
||||
extern Foo foo;
|
||||
Foo foo;
|
||||
|
||||
#ifndef DSO_BASE
|
||||
Foo foo;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TEST_CASE_WITHOUT_HEAD(cxx_constructor);
|
||||
ATF_TEST_CASE_BODY(cxx_constructor)
|
||||
{
|
||||
@ -90,3 +102,4 @@ ATF_INIT_TEST_CASES(tcs)
|
||||
ATF_ADD_TEST_CASE(tcs, cxx_constructor);
|
||||
ATF_ADD_TEST_CASE(tcs, cxx_destructor);
|
||||
}
|
||||
#endif
|
||||
|
25
lib/csu/tests/dso/Makefile
Normal file
25
lib/csu/tests/dso/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR:H}
|
||||
SHLIB= h_csu
|
||||
SHLIB_NAME= libh_csu.so
|
||||
SHLIB_MAJOR= 1
|
||||
|
||||
WITHOUT_STATIC=
|
||||
WITHOUT_PROFILE=
|
||||
WITHOUT_PIC=
|
||||
|
||||
CFLAGS+= -DDSO_LIB
|
||||
|
||||
.include "../Makefile.tests"
|
||||
SRCS=
|
||||
.for src in ${ATF_TESTS_C}
|
||||
SRCS+= ${src}.c
|
||||
.endfor
|
||||
.for src in ${ATF_TESTS_CXX}
|
||||
SRCS+= ${src}.cc
|
||||
.endfor
|
||||
|
||||
LIBDIR= ${TESTSBASE}/lib/csu/dynamiclib/
|
||||
|
||||
.include <bsd.lib.mk>
|
17
lib/csu/tests/dynamiclib/Makefile
Normal file
17
lib/csu/tests/dynamiclib/Makefile
Normal file
@ -0,0 +1,17 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR:H}
|
||||
CFLAGS+= -DDSO_BASE
|
||||
DPADD+= ${.OBJDIR:H}/dso/libh_csu.so
|
||||
LDFLAGS+= -Wl,-rpath,${TESTSDIR} -L${.OBJDIR:H}/dso
|
||||
LDADD+= -lh_csu
|
||||
|
||||
.include "../Makefile.tests"
|
||||
|
||||
.for test in ${ATF_TESTS_C}
|
||||
ATF_TESTS_CXX+= ${test}
|
||||
SRCS.${test}= ${test}.c
|
||||
.endfor
|
||||
ATF_TESTS_C:=
|
||||
|
||||
.include <bsd.test.mk>
|
@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -43,10 +44,16 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <crt.h>
|
||||
|
||||
extern bool run_dtors_test;
|
||||
extern bool run_fini_array_test;
|
||||
void dso_handle_check(void);
|
||||
|
||||
|
||||
#ifndef DSO_BASE
|
||||
typedef void (*func_ptr)(void);
|
||||
|
||||
static bool run_dtors_test = false;
|
||||
static bool run_fini_array_test = false;
|
||||
bool run_dtors_test = false;
|
||||
bool run_fini_array_test = false;
|
||||
|
||||
static void
|
||||
dtors_handler(void)
|
||||
@ -57,7 +64,9 @@ dtors_handler(void)
|
||||
}
|
||||
__section(".dtors") __used static func_ptr dtors_func =
|
||||
&dtors_handler;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(dtors_test);
|
||||
ATF_TC_BODY(dtors_test, tc)
|
||||
{
|
||||
@ -85,7 +94,9 @@ ATF_TC_BODY(dtors_test, tc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_BASE
|
||||
static void
|
||||
fini_array_handler(void)
|
||||
{
|
||||
@ -95,7 +106,9 @@ fini_array_handler(void)
|
||||
}
|
||||
__section(".fini_array") __used static func_ptr fini_array_func =
|
||||
&fini_array_handler;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(fini_array_test);
|
||||
ATF_TC_BODY(fini_array_test, tc)
|
||||
{
|
||||
@ -118,12 +131,41 @@ ATF_TC_BODY(fini_array_test, tc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_BASE
|
||||
extern void *__dso_handle;
|
||||
|
||||
void
|
||||
dso_handle_check(void)
|
||||
{
|
||||
void *dso = __dso_handle;
|
||||
|
||||
#ifdef DSO_LIB
|
||||
ATF_REQUIRE_MSG(dso != NULL,
|
||||
"Null __dso_handle in DSO");
|
||||
#else
|
||||
ATF_REQUIRE_MSG(dso == NULL,
|
||||
"Invalid __dso_handle in non-DSO");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(dso_handle_test);
|
||||
ATF_TC_BODY(dso_handle_test, tc)
|
||||
{
|
||||
|
||||
dso_handle_check();
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, dtors_test);
|
||||
ATF_TP_ADD_TC(tp, fini_array_test);
|
||||
ATF_TP_ADD_TC(tp, dso_handle_test);
|
||||
|
||||
return (atf_no_error());
|
||||
}
|
||||
#endif
|
||||
|
@ -32,41 +32,58 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#ifndef DSO_LIB
|
||||
#include <atf-c.h>
|
||||
#endif
|
||||
|
||||
#include <crt.h>
|
||||
|
||||
typedef void (*func_ptr)(void);
|
||||
|
||||
static volatile int jcr_run;
|
||||
static const func_ptr *jcr_ptr;
|
||||
static volatile int ctors_run;
|
||||
static volatile int preinit_array_run;
|
||||
static volatile int preinit_array_state = -1;
|
||||
static volatile int init_array_run;
|
||||
static volatile int init_array_state = -1;
|
||||
extern volatile int jcr_run;
|
||||
extern const func_ptr *jcr_ptr;
|
||||
extern const void *jcr_func_ptr;
|
||||
extern volatile int ctors_run;
|
||||
extern volatile int preinit_array_run;
|
||||
extern volatile int preinit_array_state;
|
||||
extern volatile int init_array_run;
|
||||
extern volatile int init_array_state;
|
||||
|
||||
#ifndef DSO_BASE
|
||||
volatile int jcr_run;
|
||||
const func_ptr *jcr_ptr;
|
||||
volatile int ctors_run;
|
||||
volatile int preinit_array_run;
|
||||
volatile int preinit_array_state = -1;
|
||||
volatile int init_array_run;
|
||||
volatile int init_array_state = -1;
|
||||
|
||||
void _Jv_RegisterClasses(const func_ptr *);
|
||||
|
||||
__section(".jcr") __used static func_ptr jcr_func = (func_ptr)1;
|
||||
const void *jcr_func_ptr = &jcr_func;
|
||||
|
||||
void
|
||||
_Jv_RegisterClasses(const func_ptr *jcr __unused)
|
||||
_Jv_RegisterClasses(const func_ptr *jcr)
|
||||
{
|
||||
|
||||
jcr_run = 1;
|
||||
jcr_ptr = jcr;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(jcr_test);
|
||||
ATF_TC_BODY(jcr_test, tc)
|
||||
{
|
||||
|
||||
ATF_REQUIRE_MSG(jcr_run == 1, ".jcr not run");
|
||||
ATF_REQUIRE_MSG(jcr_ptr == &jcr_func,
|
||||
ATF_REQUIRE_MSG(jcr_ptr == jcr_func_ptr,
|
||||
"Incorrect pointer passed to _Jv_RegisterClasses");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_BASE
|
||||
static void
|
||||
ctors_handler(void)
|
||||
{
|
||||
@ -75,7 +92,9 @@ ctors_handler(void)
|
||||
}
|
||||
__section(".ctors") __used static func_ptr ctors_func =
|
||||
&ctors_handler;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(ctors_test);
|
||||
ATF_TC_BODY(ctors_test, tc)
|
||||
{
|
||||
@ -86,7 +105,9 @@ ATF_TC_BODY(ctors_test, tc)
|
||||
ATF_REQUIRE_MSG(ctors_run == 0, ".ctors run");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(DSO_BASE) && !defined(DSO_LIB)
|
||||
static void
|
||||
preinit_array_handler(void)
|
||||
{
|
||||
@ -96,16 +117,25 @@ preinit_array_handler(void)
|
||||
}
|
||||
__section(".preinit_array") __used static func_ptr preinit_array_func =
|
||||
&preinit_array_handler;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(preinit_array_test);
|
||||
ATF_TC_BODY(preinit_array_test, tc)
|
||||
{
|
||||
|
||||
#ifdef DSO_BASE
|
||||
/* Check .preinit_array wasn't run in a DSO */
|
||||
ATF_REQUIRE_MSG(preinit_array_run == 0, ".preinit_array run in DSO");
|
||||
#else
|
||||
ATF_REQUIRE_MSG(preinit_array_run == 1, ".preinit_array not run");
|
||||
ATF_REQUIRE_MSG(preinit_array_state == 0,
|
||||
".preinit_array was not run before .init_array");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DSO_BASE
|
||||
static void
|
||||
init_array_handler(void)
|
||||
{
|
||||
@ -115,14 +145,18 @@ init_array_handler(void)
|
||||
}
|
||||
__section(".init_array") __used static func_ptr init_array_func =
|
||||
&init_array_handler;
|
||||
#endif
|
||||
|
||||
#ifndef DSO_LIB
|
||||
ATF_TC_WITHOUT_HEAD(init_array_test);
|
||||
ATF_TC_BODY(init_array_test, tc)
|
||||
{
|
||||
|
||||
ATF_REQUIRE_MSG(init_array_run == 1, ".init_array not run");
|
||||
#ifndef DSO_BASE
|
||||
ATF_REQUIRE_MSG(init_array_state == 1,
|
||||
".init_array was not run after .preinit_array");
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
@ -135,3 +169,4 @@ ATF_TP_ADD_TCS(tp)
|
||||
|
||||
return (atf_no_error());
|
||||
}
|
||||
#endif
|
||||
|
@ -928,7 +928,8 @@ be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
|
||||
{
|
||||
char be_path[BE_MAXPATHLEN];
|
||||
char buf[BE_MAXPATHLEN];
|
||||
nvlist_t *config, *vdevs;
|
||||
nvlist_t *config, *dsprops, *vdevs;
|
||||
char *origin;
|
||||
uint64_t pool_guid;
|
||||
zfs_handle_t *zhp;
|
||||
int err;
|
||||
@ -969,7 +970,18 @@ be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
|
||||
if (zhp == NULL)
|
||||
return (-1);
|
||||
|
||||
err = zfs_promote(zhp);
|
||||
if (be_prop_list_alloc(&dsprops) != 0)
|
||||
return (-1);
|
||||
|
||||
if (be_get_dataset_props(lbh, be_path, dsprops) != 0) {
|
||||
nvlist_free(dsprops);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (nvlist_lookup_string(dsprops, "origin", &origin) == 0)
|
||||
err = zfs_promote(zhp);
|
||||
nvlist_free(dsprops);
|
||||
|
||||
zfs_close(zhp);
|
||||
|
||||
if (err)
|
||||
|
@ -2,7 +2,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SRCS+= \
|
||||
amd64_detect_rdfsgsbase.c \
|
||||
amd64_get_fsbase.c \
|
||||
amd64_get_gsbase.c \
|
||||
amd64_set_fsbase.c \
|
||||
|
@ -1,63 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#define IN_RTLD 1
|
||||
#include <sys/param.h>
|
||||
#undef IN_RTLD
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include "amd64_detect_rdfsgsbase.h"
|
||||
#include "libc_private.h"
|
||||
|
||||
static int state = RDFSGS_UNKNOWN;
|
||||
|
||||
int
|
||||
amd64_detect_rdfsgsbase(void)
|
||||
{
|
||||
u_int p[4];
|
||||
|
||||
if (__predict_true(state != RDFSGS_UNKNOWN))
|
||||
return (state);
|
||||
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE) {
|
||||
do_cpuid(0x0, p);
|
||||
if (p[0] >= 0x7) {
|
||||
cpuid_count(0x7, 0x0, p);
|
||||
if ((p[1] & CPUID_STDEXT_FSGSBASE) != 0) {
|
||||
state = RDFSGS_SUPPORTED;
|
||||
return (state);
|
||||
}
|
||||
}
|
||||
}
|
||||
state = RDFSGS_UNSUPPORTED;
|
||||
return (state);
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _AMD64_DETECT_RDFSGSBASE_H_
|
||||
#define _AMD64_DETECT_RDFSGSBASE_H_
|
||||
|
||||
enum {
|
||||
RDFSGS_UNKNOWN,
|
||||
RDFSGS_SUPPORTED,
|
||||
RDFSGS_UNSUPPORTED,
|
||||
};
|
||||
|
||||
int amd64_detect_rdfsgsbase(void);
|
||||
|
||||
#endif
|
@ -2,7 +2,7 @@
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2003 Peter Wemm
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* Copyright (c) 2017, 2018 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Portions of this software were developed by Konstantin Belousov
|
||||
@ -33,18 +33,35 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#define IN_RTLD 1
|
||||
#include <sys/param.h>
|
||||
#undef IN_RTLD
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include "amd64_detect_rdfsgsbase.h"
|
||||
#include <x86/ifunc.h>
|
||||
#include "libc_private.h"
|
||||
|
||||
int
|
||||
amd64_get_fsbase(void **addr)
|
||||
static int
|
||||
amd64_get_fsbase_cpu(void **addr)
|
||||
{
|
||||
|
||||
*addr = (void *)rdfsbase();
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
amd64_get_fsbase_syscall(void **addr)
|
||||
{
|
||||
|
||||
if (amd64_detect_rdfsgsbase() == RDFSGS_SUPPORTED) {
|
||||
*addr = (void *)rdfsbase();
|
||||
return (0);
|
||||
}
|
||||
return (sysarch(AMD64_GET_FSBASE, addr));
|
||||
}
|
||||
|
||||
DEFINE_UIFUNC(, int, amd64_get_fsbase, (void **), static)
|
||||
{
|
||||
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE &&
|
||||
(cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
|
||||
return (amd64_get_fsbase_cpu);
|
||||
return (amd64_get_fsbase_syscall);
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2003 Peter Wemm
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* Copyright (c) 2017, 2018 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Portions of this software were developed by Konstantin Belousov
|
||||
@ -33,18 +33,35 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#define IN_RTLD 1
|
||||
#include <sys/param.h>
|
||||
#undef IN_RTLD
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include "amd64_detect_rdfsgsbase.h"
|
||||
#include <x86/ifunc.h>
|
||||
#include "libc_private.h"
|
||||
|
||||
int
|
||||
amd64_get_gsbase(void **addr)
|
||||
static int
|
||||
amd64_get_gsbase_cpu(void **addr)
|
||||
{
|
||||
|
||||
*addr = (void *)rdgsbase();
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
amd64_get_gsbase_syscall(void **addr)
|
||||
{
|
||||
|
||||
if (amd64_detect_rdfsgsbase() == RDFSGS_SUPPORTED) {
|
||||
*addr = (void *)rdgsbase();
|
||||
return (0);
|
||||
}
|
||||
return (sysarch(AMD64_GET_GSBASE, addr));
|
||||
}
|
||||
|
||||
DEFINE_UIFUNC(, int, amd64_get_gsbase, (void **), static)
|
||||
{
|
||||
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE &&
|
||||
(cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
|
||||
return (amd64_get_gsbase_cpu);
|
||||
return (amd64_get_gsbase_syscall);
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2003 Peter Wemm
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* Copyright (c) 2017, 2018 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Portions of this software were developed by Konstantin Belousov
|
||||
@ -33,18 +33,35 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#define IN_RTLD 1
|
||||
#include <sys/param.h>
|
||||
#undef IN_RTLD
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include "amd64_detect_rdfsgsbase.h"
|
||||
#include <x86/ifunc.h>
|
||||
#include "libc_private.h"
|
||||
|
||||
int
|
||||
amd64_set_fsbase(void *addr)
|
||||
static int
|
||||
amd64_set_fsbase_cpu(void *addr)
|
||||
{
|
||||
|
||||
wrfsbase((uintptr_t)addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
amd64_set_fsbase_syscall(void *addr)
|
||||
{
|
||||
|
||||
if (amd64_detect_rdfsgsbase() == RDFSGS_SUPPORTED) {
|
||||
wrfsbase((uintptr_t)addr);
|
||||
return (0);
|
||||
}
|
||||
return (sysarch(AMD64_SET_FSBASE, &addr));
|
||||
}
|
||||
|
||||
DEFINE_UIFUNC(, int, amd64_set_fsbase, (void *), static)
|
||||
{
|
||||
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE &&
|
||||
(cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
|
||||
return (amd64_set_fsbase_cpu);
|
||||
return (amd64_set_fsbase_syscall);
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2003 Peter Wemm
|
||||
* Copyright (c) 2017 The FreeBSD Foundation
|
||||
* Copyright (c) 2017, 2018 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Portions of this software were developed by Konstantin Belousov
|
||||
@ -33,18 +33,35 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#define IN_RTLD 1
|
||||
#include <sys/param.h>
|
||||
#undef IN_RTLD
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include "amd64_detect_rdfsgsbase.h"
|
||||
#include <x86/ifunc.h>
|
||||
#include "libc_private.h"
|
||||
|
||||
int
|
||||
amd64_set_gsbase(void *addr)
|
||||
static int
|
||||
amd64_set_gsbase_cpu(void *addr)
|
||||
{
|
||||
|
||||
wrgsbase((uintptr_t)addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
amd64_set_gsbase_syscall(void *addr)
|
||||
{
|
||||
|
||||
if (amd64_detect_rdfsgsbase() == RDFSGS_SUPPORTED) {
|
||||
wrgsbase((uintptr_t)addr);
|
||||
return (0);
|
||||
}
|
||||
return (sysarch(AMD64_SET_GSBASE, &addr));
|
||||
}
|
||||
|
||||
DEFINE_UIFUNC(, int, amd64_set_gsbase, (void *), static)
|
||||
{
|
||||
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE &&
|
||||
(cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
|
||||
return (amd64_set_gsbase_cpu);
|
||||
return (amd64_set_gsbase_syscall);
|
||||
}
|
||||
|
@ -272,17 +272,24 @@ _strptime(const char *buf, const char *fmt, struct tm *tm, int *GMTp,
|
||||
case 'k':
|
||||
case 'l':
|
||||
/*
|
||||
* Of these, %l is the only specifier explicitly
|
||||
* documented as not being zero-padded. However,
|
||||
* there is no harm in allowing zero-padding.
|
||||
* %k and %l specifiers are documented as being
|
||||
* blank-padded. However, there is no harm in
|
||||
* allowing zero-padding.
|
||||
*
|
||||
* XXX The %l specifier may gobble one too many
|
||||
* XXX %k and %l specifiers may gobble one too many
|
||||
* digits if used incorrectly.
|
||||
*/
|
||||
|
||||
len = 2;
|
||||
if ((c == 'k' || c == 'l') &&
|
||||
isblank_l((unsigned char)*buf, locale)) {
|
||||
buf++;
|
||||
len = 1;
|
||||
}
|
||||
|
||||
if (!isdigit_l((unsigned char)*buf, locale))
|
||||
return (NULL);
|
||||
|
||||
len = 2;
|
||||
for (i = 0; len && *buf != 0 &&
|
||||
isdigit_l((unsigned char)*buf, locale); buf++) {
|
||||
i *= 10;
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)gettimeofday.2 8.2 (Berkeley) 5/26/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2018
|
||||
.Dd October 27, 2018
|
||||
.Dt GETTIMEOFDAY 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -89,6 +89,11 @@ structure indicates the local time zone
|
||||
and a flag that, if nonzero, indicates that
|
||||
Daylight Saving time applies locally during
|
||||
the appropriate part of the year.
|
||||
The kernel generally does not track these values and they
|
||||
are usually returned as zero.
|
||||
Use
|
||||
.Xr localtime 3
|
||||
to find the offset for the currently active timezone.
|
||||
.Pp
|
||||
Only the super-user may set the time of day or time zone.
|
||||
If the system is running at securelevel >= 2 (see
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd November 13, 2014
|
||||
.Dd November 1, 2018
|
||||
.Dt POLL 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -232,7 +232,15 @@ points outside the process's allocated address space.
|
||||
A signal was delivered before the time limit expired and
|
||||
before any of the selected events occurred.
|
||||
.It Bq Er EINVAL
|
||||
The specified time limit is invalid. One of its components is negative or too large.
|
||||
The specified time limit is invalid.
|
||||
One of its components is negative or too large.
|
||||
.It Bq Er EINVAL
|
||||
The number of pollfd structures specified by
|
||||
.Fa nfds
|
||||
exceeds the system tunable
|
||||
.Va kern.maxfilesperproc
|
||||
and
|
||||
.Dv FD_SETSIZE .
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr accept 2 ,
|
||||
|
@ -20,6 +20,7 @@ TESTS_SUBDIRS+= stdlib
|
||||
TESTS_SUBDIRS+= string
|
||||
TESTS_SUBDIRS+= sys
|
||||
TESTS_SUBDIRS+= termios
|
||||
TESTS_SUBDIRS+= time
|
||||
TESTS_SUBDIRS+= tls
|
||||
TESTS_SUBDIRS+= ttyio
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)ftime.3 8.1 (Berkeley) 6/4/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd June 4, 1993
|
||||
.Dd August 4, 2018
|
||||
.Dt FTIME 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -67,9 +67,8 @@ struct timeb
|
||||
.Pp
|
||||
The structure contains the time since the epoch in seconds,
|
||||
up to 1000 milliseconds of more-precise interval,
|
||||
the local time zone (measured in minutes of time westward from Greenwich),
|
||||
and a flag that, if nonzero, indicates that
|
||||
Daylight Saving time applies locally during the appropriate part of the year.
|
||||
The kernel no longer maintains the timezone and dstflag info, so 0 is
|
||||
always returned for these fields.
|
||||
.Sh SEE ALSO
|
||||
.Xr gettimeofday 2 ,
|
||||
.Xr settimeofday 2 ,
|
||||
@ -79,4 +78,4 @@ Daylight Saving time applies locally during the appropriate part of the year.
|
||||
The
|
||||
.Nm
|
||||
function appeared in
|
||||
.Bx 4.2 .
|
||||
.At v7 .
|
||||
|
@ -146,6 +146,8 @@ pmu_alias_get(const char *name)
|
||||
struct pmu_event_desc {
|
||||
uint64_t ped_period;
|
||||
uint64_t ped_offcore_rsp;
|
||||
uint64_t ped_l3_thread;
|
||||
uint64_t ped_l3_slice;
|
||||
uint32_t ped_event;
|
||||
uint32_t ped_frontend;
|
||||
uint32_t ped_ldlat;
|
||||
@ -270,6 +272,10 @@ pmu_parse_event(struct pmu_event_desc *ped, const char *eventin)
|
||||
ped->ped_ch_mask = strtol(value, NULL, 16);
|
||||
else if (strcmp(key, "config1") == 0)
|
||||
ped->ped_config1 = strtol(value, NULL, 16);
|
||||
else if (strcmp(key, "l3_thread_mask") == 0)
|
||||
ped->ped_l3_thread = strtol(value, NULL, 16);
|
||||
else if (strcmp(key, "l3_slice_mask") == 0)
|
||||
ped->ped_l3_slice = strtol(value, NULL, 16);
|
||||
else {
|
||||
debug = getenv("PMUDEBUG");
|
||||
if (debug != NULL && strcmp(debug, "true") == 0 && value != NULL)
|
||||
@ -407,33 +413,50 @@ pmc_pmu_print_counter_full(const char *ev)
|
||||
}
|
||||
|
||||
static int
|
||||
pmc_pmu_amd_pmcallocate(const char *event_name __unused, struct pmc_op_pmcallocate *pm,
|
||||
pmc_pmu_amd_pmcallocate(const char *event_name, struct pmc_op_pmcallocate *pm,
|
||||
struct pmu_event_desc *ped)
|
||||
{
|
||||
struct pmc_md_amd_op_pmcallocate *amd;
|
||||
const struct pmu_event *pe;
|
||||
int idx = -1;
|
||||
|
||||
amd = &pm->pm_md.pm_amd;
|
||||
amd->pm_amd_config = AMD_PMC_TO_EVENTMASK(ped->ped_event);
|
||||
if (ped->ped_umask > 0) {
|
||||
pm->pm_caps |= PMC_CAP_QUALIFIER;
|
||||
amd->pm_amd_config |= AMD_PMC_TO_UNITMASK(ped->ped_umask);
|
||||
}
|
||||
pm->pm_class = PMC_CLASS_K8;
|
||||
pe = pmu_event_get(NULL, event_name, &idx);
|
||||
|
||||
if ((pm->pm_caps & (PMC_CAP_USER|PMC_CAP_SYSTEM)) == 0 ||
|
||||
(pm->pm_caps & (PMC_CAP_USER|PMC_CAP_SYSTEM)) ==
|
||||
(PMC_CAP_USER|PMC_CAP_SYSTEM))
|
||||
amd->pm_amd_config |= (AMD_PMC_USR | AMD_PMC_OS);
|
||||
else if (pm->pm_caps & PMC_CAP_USER)
|
||||
amd->pm_amd_config |= AMD_PMC_USR;
|
||||
else if (pm->pm_caps & PMC_CAP_SYSTEM)
|
||||
amd->pm_amd_config |= AMD_PMC_OS;
|
||||
if (ped->ped_edge)
|
||||
amd->pm_amd_config |= AMD_PMC_EDGE;
|
||||
if (ped->ped_inv)
|
||||
amd->pm_amd_config |= AMD_PMC_EDGE;
|
||||
if (pm->pm_caps & PMC_CAP_INTERRUPT)
|
||||
amd->pm_amd_config |= AMD_PMC_INT;
|
||||
if (strcmp("l3cache", pe->topic) == 0){
|
||||
amd->pm_amd_config |= AMD_PMC_TO_EVENTMASK(ped->ped_event);
|
||||
amd->pm_amd_sub_class = PMC_AMD_SUB_CLASS_L3_CACHE;
|
||||
amd->pm_amd_config |= AMD_PMC_TO_L3SLICE(ped->ped_l3_slice);
|
||||
amd->pm_amd_config |= AMD_PMC_TO_L3CORE(ped->ped_l3_thread);
|
||||
}
|
||||
else if (strcmp("data fabric", pe->topic) == 0){
|
||||
|
||||
amd->pm_amd_config |= AMD_PMC_TO_EVENTMASK_DF(ped->ped_event);
|
||||
amd->pm_amd_sub_class = PMC_AMD_SUB_CLASS_DATA_FABRIC;
|
||||
}
|
||||
else{
|
||||
amd->pm_amd_config |= AMD_PMC_TO_EVENTMASK(ped->ped_event);
|
||||
amd->pm_amd_sub_class = PMC_AMD_SUB_CLASS_CORE;
|
||||
if ((pm->pm_caps & (PMC_CAP_USER|PMC_CAP_SYSTEM)) == 0 ||
|
||||
(pm->pm_caps & (PMC_CAP_USER|PMC_CAP_SYSTEM)) ==
|
||||
(PMC_CAP_USER|PMC_CAP_SYSTEM))
|
||||
amd->pm_amd_config |= (AMD_PMC_USR | AMD_PMC_OS);
|
||||
else if (pm->pm_caps & PMC_CAP_USER)
|
||||
amd->pm_amd_config |= AMD_PMC_USR;
|
||||
else if (pm->pm_caps & PMC_CAP_SYSTEM)
|
||||
amd->pm_amd_config |= AMD_PMC_OS;
|
||||
if (ped->ped_edge)
|
||||
amd->pm_amd_config |= AMD_PMC_EDGE;
|
||||
if (ped->ped_inv)
|
||||
amd->pm_amd_config |= AMD_PMC_EDGE;
|
||||
if (pm->pm_caps & PMC_CAP_INTERRUPT)
|
||||
amd->pm_amd_config |= AMD_PMC_INT;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
2668
lib/libpmc/pmu-events/arch/x86/amdfam17h/data-fabric.json
Normal file
2668
lib/libpmc/pmu-events/arch/x86/amdfam17h/data-fabric.json
Normal file
File diff suppressed because it is too large
Load Diff
5411
lib/libpmc/pmu-events/arch/x86/amdfam17h/l3cache.json
Normal file
5411
lib/libpmc/pmu-events/arch/x86/amdfam17h/l3cache.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/stddef.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
@ -54,8 +54,6 @@
|
||||
#include "json.h"
|
||||
#include "jevents.h"
|
||||
|
||||
int snprintf(char * __restrict, size_t, const char * __restrict,
|
||||
...) __printflike(3, 4);
|
||||
_Noreturn void _Exit(int);
|
||||
|
||||
int verbose;
|
||||
@ -186,6 +184,8 @@ static struct field {
|
||||
{ "SampleAfterValue", "period=" },
|
||||
{ "FCMask", "fc_mask=" },
|
||||
{ "PortMask", "ch_mask=" },
|
||||
{ "L3ThreadMask", "l3_thread_mask=" },
|
||||
{ "L3SliceMask", "l3_slice_mask=" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
@ -859,8 +859,11 @@ static int get_maxfds(void)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
|
||||
if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
|
||||
return min((int)rlim.rlim_max / 2, 512);
|
||||
if (getrlimit(RLIMIT_NOFILE, &rlim) == 0) {
|
||||
if (rlim.rlim_max == RLIM_INFINITY)
|
||||
return 512;
|
||||
return min((unsigned)rlim.rlim_max / 2, 512);
|
||||
}
|
||||
|
||||
return 512;
|
||||
}
|
||||
@ -1121,8 +1124,8 @@ int main(int argc, char *argv[])
|
||||
mapfile = NULL;
|
||||
rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0);
|
||||
if (rc && verbose) {
|
||||
pr_info("%s: Error preprocessing arch standard files %s\n",
|
||||
prog, ldirname);
|
||||
pr_info("%s: Error preprocessing arch standard files %s: %s\n",
|
||||
prog, ldirname, strerror(errno));
|
||||
goto empty_map;
|
||||
} else if (rc < 0) {
|
||||
/* Make build fail */
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd March 30, 2008
|
||||
.Dd November 4, 2018
|
||||
.Dt CSQRT 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -78,7 +78,7 @@ k + \*(Na*I \*(Na + \*(Na*I \&
|
||||
.Pp
|
||||
For numbers with negative imaginary parts, the above special cases
|
||||
apply given the identity:
|
||||
.Dl csqrt(conj(z) = conj(sqrt(z))
|
||||
.Dl csqrt(conj(z)) = conj(csqrt(z))
|
||||
Note that the sign of \*(Na is indeterminate.
|
||||
Also, if the real or imaginary part of the input is finite and
|
||||
an \*(Na is generated, an invalid exception will be thrown.
|
||||
|
@ -47,10 +47,10 @@ done
|
||||
dirs=`echo $dirs | sed 's/:/ /g'`
|
||||
case X"$dirs" in X) echo "usage: $0 [options] directories ..."; exit 1;; esac
|
||||
|
||||
localdirs=`find -H $dirs -fstype local -type d -prune -print`
|
||||
localdirs=`find -H $dirs -fstype local \! -fstype rdonly -type d -prune -print`
|
||||
|
||||
case X"$localdirs" in
|
||||
X) echo "$0: no local-mounted manual directories found: $dirs"
|
||||
X) echo "$0: no local rw-mounted manual directories found: $dirs"
|
||||
exit 1;;
|
||||
*) exec `basename $0 .local` $opt $localdirs;;
|
||||
esac
|
||||
|
@ -617,6 +617,7 @@ savecore_enable="YES" # Extract core from dump devices if any
|
||||
savecore_flags="-m 10" # Used if dumpdev is enabled above, and present.
|
||||
# By default, only the 10 most recent kernel dumps
|
||||
# are saved.
|
||||
service_delete_empty="NO" # Have 'service delete' remove empty rc.conf.d files.
|
||||
crashinfo_enable="YES" # Automatically generate crash dump summary.
|
||||
crashinfo_program="/usr/sbin/crashinfo" # Script to generate crash dump summary.
|
||||
quota_enable="NO" # turn on quotas on startup (or NO).
|
||||
|
@ -92,7 +92,7 @@ local_unbound_prestart()
|
||||
fi
|
||||
|
||||
# Retrieve DNSSEC root key
|
||||
if [ ! -f ${local_unbound_anchor} ] ; then
|
||||
if [ ! -s ${local_unbound_anchor} ] ; then
|
||||
run_rc_command anchor
|
||||
fi
|
||||
}
|
||||
|
@ -55,4 +55,22 @@ fi
|
||||
/usr/bin/logger -t $subsystem resumed at `/bin/date +'%Y%m%d %H:%M:%S'`
|
||||
/bin/sync && /bin/sync && /bin/sync
|
||||
|
||||
. /etc/rc.subr
|
||||
|
||||
load_rc_config
|
||||
|
||||
rcorder_opts="-k resume"
|
||||
|
||||
case ${local_startup} in
|
||||
[Nn][Oo] | '') ;;
|
||||
*) find_local_scripts_new ;;
|
||||
esac
|
||||
|
||||
files=`rcorder ${rcorder_opts} /etc/rc.d/* ${local_rc} 2>/dev/null`
|
||||
|
||||
for _rc_elem in $files; do
|
||||
debug "run_rc_script $_rc_elem resume"
|
||||
run_rc_script $_rc_elem resume
|
||||
done
|
||||
|
||||
exit 0
|
||||
|
@ -922,7 +922,7 @@ run_rc_command()
|
||||
eval _override_command=\$${name}_program
|
||||
command=${_override_command:-$command}
|
||||
|
||||
_keywords="start stop restart rcvar enabled describe extracommands $extra_commands"
|
||||
_keywords="start stop restart rcvar enable disable delete enabled describe extracommands $extra_commands"
|
||||
rc_pid=
|
||||
_pidcmd=
|
||||
_procname=${procname:-${command}}
|
||||
@ -977,12 +977,13 @@ run_rc_command()
|
||||
if [ "$_elem" != "$rc_arg" ]; then
|
||||
continue
|
||||
fi
|
||||
# if ${rcvar} is set, $1 is not "rcvar" and not "describe"
|
||||
# and ${rc_pid} is not set, then run
|
||||
# if ${rcvar} is set, $1 is not "rcvar", "describe",
|
||||
# "enable" or "delete", and ${rc_pid} is not set, run:
|
||||
# checkyesno ${rcvar}
|
||||
# and return if that failed
|
||||
#
|
||||
if [ -n "${rcvar}" -a "$rc_arg" != "rcvar" -a "$rc_arg" != "stop" \
|
||||
-a "$rc_arg" != "delete" -a "$rc_arg" != "enable" \
|
||||
-a "$rc_arg" != "describe" ] ||
|
||||
[ -n "${rcvar}" -a "$rc_arg" = "stop" -a -z "${rc_pid}" ]; then
|
||||
if ! checkyesno ${rcvar}; then
|
||||
@ -1030,6 +1031,31 @@ run_rc_command()
|
||||
echo "$extra_commands"
|
||||
;;
|
||||
|
||||
enable)
|
||||
_out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=YES") &&
|
||||
echo "$name enabled in ${_out%%:*}"
|
||||
;;
|
||||
|
||||
disable)
|
||||
_out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=NO") &&
|
||||
echo "$name disabled in ${_out%%:*}"
|
||||
;;
|
||||
|
||||
delete)
|
||||
_files=
|
||||
for _file in $(sysrc -lEs "$name"); do
|
||||
_out=$(sysrc -Fif $_file "$rcvar") && _files="$_files $_file"
|
||||
done
|
||||
/usr/sbin/sysrc -x "$rcvar" && echo "$rcvar deleted in ${_files# }"
|
||||
# delete file in rc.conf.d if desired and empty.
|
||||
checkyesno service_delete_empty || _files=
|
||||
for _file in $_files; do
|
||||
[ "$_file" = "${_file#*/rc.conf.d/}" ] && continue
|
||||
[ $(/usr/bin/stat -f%z $_file) -gt 0 ] && continue
|
||||
/bin/rm "$_file" && echo "Empty file $_file removed"
|
||||
done
|
||||
;;
|
||||
|
||||
status)
|
||||
_run_rc_precmd || return 1
|
||||
if [ -n "$rc_pid" ]; then
|
||||
|
@ -31,7 +31,9 @@ LDFLAGS+= -nostdlib -e _rtld_start
|
||||
.else
|
||||
LDFLAGS+= -nostdlib -e .rtld_start
|
||||
.endif
|
||||
WARNS?= 2
|
||||
|
||||
NO_WCAST_ALIGN= yes
|
||||
WARNS?= 6
|
||||
INSTALLFLAGS= -C -b
|
||||
PRECIOUSPROG=
|
||||
BINDIR= /libexec
|
||||
@ -95,3 +97,13 @@ SUBDIR.${MK_TESTS}+= tests
|
||||
.include <bsd.prog.mk>
|
||||
${PROG_FULL}: ${VERSION_MAP}
|
||||
.include <bsd.symver.mk>
|
||||
|
||||
.if ${COMPILER_TYPE} == "gcc"
|
||||
# GCC warns about redeclarations even though they have __exported
|
||||
# and are therefore not identical to the ones from the system headers.
|
||||
CFLAGS+= -Wno-redundant-decls
|
||||
.if ${COMPILER_VERSION} < 40300
|
||||
# Silence -Wshadow false positives in ancient GCC
|
||||
CFLAGS+= -Wno-shadow
|
||||
.endif
|
||||
.endif
|
||||
|
@ -84,7 +84,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
*/
|
||||
assert(dstobj->mainprog);
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)dstobj->rela +
|
||||
relalim = (const Elf_Rela *)((const char *)dstobj->rela +
|
||||
dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) != R_AARCH64_COPY)
|
||||
@ -128,6 +128,8 @@ struct tls_data {
|
||||
const Elf_Rela *rela;
|
||||
};
|
||||
|
||||
int64_t rtld_tlsdesc_handle(struct tls_data *tlsdesc, int flags);
|
||||
|
||||
static struct tls_data *
|
||||
reloc_tlsdesc_alloc(Obj_Entry *obj, const Elf_Rela *rela)
|
||||
{
|
||||
@ -205,7 +207,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -243,7 +245,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
const Elf_Sym *def;
|
||||
struct tls_data *tlsdesc;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where, target;
|
||||
|
||||
@ -289,7 +291,7 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
|
||||
if (!obj->irelative)
|
||||
return (0);
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) == R_AARCH64_IRELATIVE) {
|
||||
ptr = (Elf_Addr *)(obj->relocbase + rela->r_addend);
|
||||
@ -316,7 +318,7 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
|
||||
if (!obj->gnu_ifunc)
|
||||
return (0);
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) == R_AARCH64_JUMP_SLOT) {
|
||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
@ -338,8 +340,9 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
}
|
||||
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const Obj_Entry *defobj __unused, const Obj_Entry *obj __unused,
|
||||
const Elf_Rel *rel)
|
||||
{
|
||||
|
||||
assert(ELF_R_TYPE(rel->r_info) == R_AARCH64_JUMP_SLOT ||
|
||||
@ -386,7 +389,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
cache = calloc(obj->dynsymcount, sizeof(SymCache));
|
||||
/* No need to check for NULL here */
|
||||
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
/*
|
||||
* First, resolve symbol for relocations which
|
||||
@ -471,7 +474,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error(
|
||||
"%s: No space available for static "
|
||||
"Thread Local Storage", obj->path);
|
||||
|
@ -35,8 +35,9 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mman.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/specialreg.h>
|
||||
#include <machine/sysarch.h>
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <err.h>
|
||||
@ -67,7 +68,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
|
||||
assert(dstobj->mainprog); /* COPY relocations are invalid elsewhere */
|
||||
|
||||
relalim = (const Elf_Rela *) ((caddr_t) dstobj->rela + dstobj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *) dstobj->rela + dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) == R_X86_64_COPY) {
|
||||
void *dstaddr;
|
||||
@ -80,7 +81,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
SymLook req;
|
||||
int res;
|
||||
|
||||
dstaddr = (void *) (dstobj->relocbase + rela->r_offset);
|
||||
dstaddr = (void *)(dstobj->relocbase + rela->r_offset);
|
||||
dstsym = dstobj->symtab + ELF_R_SYM(rela->r_info);
|
||||
name = dstobj->strtab + dstsym->st_name;
|
||||
size = dstsym->st_size;
|
||||
@ -104,7 +105,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
return -1;
|
||||
}
|
||||
|
||||
srcaddr = (const void *) (defobj->relocbase + srcsym->st_value);
|
||||
srcaddr = (const void *)(defobj->relocbase + srcsym->st_value);
|
||||
memcpy(dstaddr, srcaddr, size);
|
||||
}
|
||||
}
|
||||
@ -147,7 +148,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
} else
|
||||
cache = NULL;
|
||||
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char*)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
/*
|
||||
* First, resolve symbol for relocations which
|
||||
@ -254,7 +255,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* of space, we generate an error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available "
|
||||
"for static Thread Local Storage",
|
||||
obj->path);
|
||||
@ -274,7 +276,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* of space, we generate an error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available "
|
||||
"for static Thread Local Storage",
|
||||
obj->path);
|
||||
@ -322,7 +325,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -355,7 +358,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
|
||||
if (obj->jmpslots_done)
|
||||
return 0;
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where, target;
|
||||
const Elf_Sym *def;
|
||||
@ -392,8 +395,9 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
/* Fixup the jump slot at "where" to transfer control to "target". */
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const struct Struct_Obj_Entry *obj, const struct Struct_Obj_Entry *refobj,
|
||||
const Elf_Rel *rel)
|
||||
const struct Struct_Obj_Entry *obj __unused,
|
||||
const struct Struct_Obj_Entry *refobj __unused,
|
||||
const Elf_Rel *rel __unused)
|
||||
{
|
||||
#ifdef dbg
|
||||
dbg("reloc_jmpslot: *%p = %p", where, (void *)target);
|
||||
@ -411,7 +415,7 @@ reloc_iresolve(Obj_Entry *obj, RtldLockState *lockstate)
|
||||
|
||||
if (!obj->irelative)
|
||||
return (0);
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where, target, *ptr;
|
||||
|
||||
@ -441,7 +445,7 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
|
||||
if (!obj->gnu_ifunc)
|
||||
return (0);
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where, target;
|
||||
const Elf_Sym *def;
|
||||
@ -492,17 +496,26 @@ pre_init(void)
|
||||
|
||||
}
|
||||
|
||||
int __getosreldate(void);
|
||||
|
||||
void
|
||||
allocate_initial_tls(Obj_Entry *objs)
|
||||
{
|
||||
/*
|
||||
* Fix the size of the static TLS block by using the maximum
|
||||
* offset allocated so far and adding a bit for dynamic modules to
|
||||
* use.
|
||||
*/
|
||||
tls_static_space = tls_last_offset + RTLD_STATIC_TLS_EXTRA;
|
||||
amd64_set_fsbase(allocate_tls(objs, 0,
|
||||
3*sizeof(Elf_Addr), sizeof(Elf_Addr)));
|
||||
void *addr;
|
||||
|
||||
/*
|
||||
* Fix the size of the static TLS block by using the maximum
|
||||
* offset allocated so far and adding a bit for dynamic
|
||||
* modules to use.
|
||||
*/
|
||||
tls_static_space = tls_last_offset + RTLD_STATIC_TLS_EXTRA;
|
||||
|
||||
addr = allocate_tls(objs, 0, 3 * sizeof(Elf_Addr), sizeof(Elf_Addr));
|
||||
if (__getosreldate() >= P_OSREL_WRFSBASE &&
|
||||
(cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
|
||||
wrfsbase((uintptr_t)addr);
|
||||
else
|
||||
sysarch(AMD64_SET_FSBASE, &addr);
|
||||
}
|
||||
|
||||
void *__tls_get_addr(tls_index *ti)
|
||||
|
@ -75,7 +75,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
|
||||
assert(dstobj->mainprog); /* COPY relocations are invalid elsewhere */
|
||||
|
||||
rellim = (const Elf_Rel *) ((caddr_t) dstobj->rel + dstobj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *) dstobj->rel + dstobj->relsize);
|
||||
for (rel = dstobj->rel; rel < rellim; rel++) {
|
||||
if (ELF_R_TYPE(rel->r_info) == R_ARM_COPY) {
|
||||
void *dstaddr;
|
||||
@ -88,7 +88,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
SymLook req;
|
||||
int res;
|
||||
|
||||
dstaddr = (void *) (dstobj->relocbase + rel->r_offset);
|
||||
dstaddr = (void *)(dstobj->relocbase + rel->r_offset);
|
||||
dstsym = dstobj->symtab + ELF_R_SYM(rel->r_info);
|
||||
name = dstobj->strtab + dstsym->st_name;
|
||||
size = dstsym->st_size;
|
||||
@ -125,8 +125,6 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
void _rtld_bind_start(void);
|
||||
void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
|
||||
|
||||
int open();
|
||||
int _open();
|
||||
void
|
||||
_rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
{
|
||||
@ -145,7 +143,7 @@ _rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
break;
|
||||
}
|
||||
}
|
||||
rellim = (const Elf_Rel *)((caddr_t)rel + relsz);
|
||||
rellim = (const Elf_Rel *)((const char *)rel + relsz);
|
||||
size = (rellim - 1)->r_offset - rel->r_offset;
|
||||
for (; rel < rellim; rel++) {
|
||||
where = (Elf_Addr *)(relocbase + rel->r_offset);
|
||||
@ -375,7 +373,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
cache = calloc(obj->dynsymcount, sizeof(SymCache));
|
||||
/* No need to check for NULL here */
|
||||
|
||||
rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->rel + obj->relsize);
|
||||
for (rel = obj->rel; rel < rellim; rel++) {
|
||||
if (reloc_nonplt_object(obj, rel, cache, flags, lockstate) < 0)
|
||||
goto done;
|
||||
@ -396,7 +394,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rel *rellim;
|
||||
const Elf_Rel *rel;
|
||||
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel +
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel +
|
||||
obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where;
|
||||
@ -423,7 +421,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
Elf_Addr *where;
|
||||
Elf_Addr target;
|
||||
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
assert(ELF_R_TYPE(rel->r_info) == R_ARM_JUMP_SLOT);
|
||||
where = (Elf_Addr *)(obj->relocbase + rel->r_offset);
|
||||
@ -445,7 +443,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -453,8 +452,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -462,8 +461,9 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
}
|
||||
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const Obj_Entry *defobj __unused, const Obj_Entry *obj __unused,
|
||||
const Elf_Rel *rel)
|
||||
{
|
||||
|
||||
assert(ELF_R_TYPE(rel->r_info) == R_ARM_JUMP_SLOT);
|
||||
|
@ -67,7 +67,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
|
||||
assert(dstobj->mainprog); /* COPY relocations are invalid elsewhere */
|
||||
|
||||
rellim = (const Elf_Rel *) ((caddr_t) dstobj->rel + dstobj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *)dstobj->rel + dstobj->relsize);
|
||||
for (rel = dstobj->rel; rel < rellim; rel++) {
|
||||
if (ELF_R_TYPE(rel->r_info) == R_386_COPY) {
|
||||
void *dstaddr;
|
||||
@ -80,7 +80,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
SymLook req;
|
||||
int res;
|
||||
|
||||
dstaddr = (void *) (dstobj->relocbase + rel->r_offset);
|
||||
dstaddr = (void *)(dstobj->relocbase + rel->r_offset);
|
||||
dstsym = dstobj->symtab + ELF_R_SYM(rel->r_info);
|
||||
name = dstobj->strtab + dstsym->st_name;
|
||||
size = dstsym->st_size;
|
||||
@ -104,7 +104,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
return -1;
|
||||
}
|
||||
|
||||
srcaddr = (const void *) (defobj->relocbase + srcsym->st_value);
|
||||
srcaddr = (const void *)(defobj->relocbase + srcsym->st_value);
|
||||
memcpy(dstaddr, srcaddr, size);
|
||||
}
|
||||
}
|
||||
@ -146,7 +146,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
} else
|
||||
cache = NULL;
|
||||
|
||||
rellim = (const Elf_Rel *)((caddr_t) obj->rel + obj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->rel + obj->relsize);
|
||||
for (rel = obj->rel; rel < rellim; rel++) {
|
||||
switch (ELF_R_TYPE(rel->r_info)) {
|
||||
case R_386_32:
|
||||
@ -239,7 +239,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* of space, we generate an error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available "
|
||||
"for static Thread Local Storage",
|
||||
obj->path);
|
||||
@ -278,7 +279,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rel *rellim;
|
||||
const Elf_Rel *rel;
|
||||
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where/*, val*/;
|
||||
|
||||
@ -311,7 +312,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
|
||||
if (obj->jmpslots_done)
|
||||
return 0;
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where, target;
|
||||
const Elf_Sym *def;
|
||||
@ -349,8 +350,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
/* Fixup the jump slot at "where" to transfer control to "target". */
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const struct Struct_Obj_Entry *obj, const struct Struct_Obj_Entry *refobj,
|
||||
const Elf_Rel *rel)
|
||||
const Obj_Entry *obj __unused, const Obj_Entry *refobj __unused,
|
||||
const Elf_Rel *rel __unused)
|
||||
{
|
||||
#ifdef dbg
|
||||
dbg("reloc_jmpslot: *%p = %p", where, (void *)target);
|
||||
@ -369,7 +370,7 @@ reloc_iresolve(Obj_Entry *obj, RtldLockState *lockstate)
|
||||
|
||||
if (!obj->irelative)
|
||||
return (0);
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
switch (ELF_R_TYPE(rel->r_info)) {
|
||||
case R_386_IRELATIVE:
|
||||
@ -393,7 +394,7 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
|
||||
if (!obj->gnu_ifunc)
|
||||
return (0);
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where, target;
|
||||
const Elf_Sym *def;
|
||||
|
@ -58,7 +58,7 @@ extern uint32_t cpu_feature2;
|
||||
extern uint32_t cpu_stdext_feature;
|
||||
extern uint32_t cpu_stdext_feature2;
|
||||
#define call_ifunc_resolver(ptr) \
|
||||
(((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t))ptr)( \
|
||||
(((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t))(ptr))( \
|
||||
cpu_feature, cpu_feature2, cpu_stdext_feature, cpu_stdext_feature2))
|
||||
|
||||
#define round(size, align) \
|
||||
|
@ -25,7 +25,7 @@ struct lm {
|
||||
TAILQ_ENTRY(lm) lm_link;
|
||||
};
|
||||
|
||||
TAILQ_HEAD(lmp_list, lmp) lmp_head = TAILQ_HEAD_INITIALIZER(lmp_head);
|
||||
static TAILQ_HEAD(lmp_list, lmp) lmp_head = TAILQ_HEAD_INITIALIZER(lmp_head);
|
||||
struct lmp {
|
||||
char *p;
|
||||
enum { T_EXACT=0, T_BASENAME, T_DIRECTORY } type;
|
||||
@ -44,8 +44,8 @@ struct lmc {
|
||||
static int lm_count;
|
||||
|
||||
static void lmc_parse(char *, size_t);
|
||||
static void lmc_parse_file(char *);
|
||||
static void lmc_parse_dir(char *);
|
||||
static void lmc_parse_file(const char *);
|
||||
static void lmc_parse_dir(const char *);
|
||||
static void lm_add(const char *, const char *, const char *);
|
||||
static void lm_free(struct lm_list *);
|
||||
static char *lml_find(struct lm_list *, const char *);
|
||||
@ -96,7 +96,7 @@ lm_init(char *libmap_override)
|
||||
}
|
||||
|
||||
static void
|
||||
lmc_parse_file(char *path)
|
||||
lmc_parse_file(const char *path)
|
||||
{
|
||||
struct lmc *p;
|
||||
char *lm_map;
|
||||
@ -149,7 +149,7 @@ lmc_parse_file(char *path)
|
||||
}
|
||||
|
||||
static void
|
||||
lmc_parse_dir(char *idir)
|
||||
lmc_parse_dir(const char *idir)
|
||||
{
|
||||
DIR *d;
|
||||
struct dirent *dp;
|
||||
@ -199,8 +199,7 @@ lmc_parse(char *lm_p, size_t lm_len)
|
||||
char prog[MAXPATHLEN];
|
||||
/* allow includedir + full length path */
|
||||
char line[MAXPATHLEN + 13];
|
||||
size_t cnt;
|
||||
int i;
|
||||
size_t cnt, i;
|
||||
|
||||
cnt = 0;
|
||||
p = NULL;
|
||||
@ -403,7 +402,7 @@ lm_find(const char *p, const char *f)
|
||||
* replacement library, or NULL.
|
||||
*/
|
||||
char *
|
||||
lm_findn(const char *p, const char *f, const int n)
|
||||
lm_findn(const char *p, const char *f, const size_t n)
|
||||
{
|
||||
char pathbuf[64], *s, *t;
|
||||
|
||||
|
@ -5,4 +5,4 @@
|
||||
int lm_init (char *);
|
||||
void lm_fini (void);
|
||||
char * lm_find (const char *, const char *);
|
||||
char * lm_findn (const char *, const char *, const int);
|
||||
char * lm_findn (const char *, const char *, const size_t);
|
||||
|
@ -60,15 +60,11 @@ static char *rcsid = "$FreeBSD$";
|
||||
#include "rtld_printf.h"
|
||||
#include "paths.h"
|
||||
|
||||
static void morecore();
|
||||
static int findbucket();
|
||||
|
||||
/*
|
||||
* Pre-allocate mmap'ed pages
|
||||
*/
|
||||
#define NPOOLPAGES (128*1024/pagesz)
|
||||
static caddr_t pagepool_start, pagepool_end;
|
||||
static int morepages();
|
||||
|
||||
/*
|
||||
* The overhead on a block is at least 4 bytes. When free, this space
|
||||
@ -96,6 +92,11 @@ union overhead {
|
||||
#define ov_size ovu.ovu_size
|
||||
};
|
||||
|
||||
static void morecore(int bucket);
|
||||
static int morepages(int n);
|
||||
static int findbucket(union overhead *freep, int srchlen);
|
||||
|
||||
|
||||
#define MAGIC 0xef /* magic # on accounting info */
|
||||
#define RMAGIC 0x5555 /* magic # on range info */
|
||||
|
||||
@ -150,16 +151,14 @@ botch(s)
|
||||
* must contain at least one page size. The page sizes must be stored in
|
||||
* increasing order.
|
||||
*/
|
||||
extern size_t *pagesizes;
|
||||
|
||||
void *
|
||||
malloc(nbytes)
|
||||
size_t nbytes;
|
||||
malloc(size_t nbytes)
|
||||
{
|
||||
register union overhead *op;
|
||||
register int bucket;
|
||||
register long n;
|
||||
register unsigned amt;
|
||||
union overhead *op;
|
||||
int bucket;
|
||||
ssize_t n;
|
||||
size_t amt;
|
||||
|
||||
/*
|
||||
* First time malloc is called, setup page size and
|
||||
@ -256,11 +255,10 @@ calloc(size_t num, size_t size)
|
||||
* Allocate more memory to the indicated bucket.
|
||||
*/
|
||||
static void
|
||||
morecore(bucket)
|
||||
int bucket;
|
||||
morecore(int bucket)
|
||||
{
|
||||
register union overhead *op;
|
||||
register int sz; /* size of desired block */
|
||||
union overhead *op;
|
||||
int sz; /* size of desired block */
|
||||
int amt; /* amount to allocate */
|
||||
int nblks; /* how many blocks we get */
|
||||
|
||||
@ -300,11 +298,10 @@ morecore(bucket)
|
||||
}
|
||||
|
||||
void
|
||||
free(cp)
|
||||
void *cp;
|
||||
free(void * cp)
|
||||
{
|
||||
register int size;
|
||||
register union overhead *op;
|
||||
int size;
|
||||
union overhead *op;
|
||||
|
||||
if (cp == NULL)
|
||||
return;
|
||||
@ -339,15 +336,13 @@ free(cp)
|
||||
* is extern so the caller can modify it). If that fails we just copy
|
||||
* however many bytes was given to realloc() and hope it's not huge.
|
||||
*/
|
||||
int realloc_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
|
||||
static int realloc_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
|
||||
|
||||
void *
|
||||
realloc(cp, nbytes)
|
||||
void *cp;
|
||||
size_t nbytes;
|
||||
realloc(void *cp, size_t nbytes)
|
||||
{
|
||||
register u_int onb;
|
||||
register int i;
|
||||
u_int onb;
|
||||
int i;
|
||||
union overhead *op;
|
||||
char *res;
|
||||
int was_alloced = 0;
|
||||
@ -413,12 +408,10 @@ realloc(cp, nbytes)
|
||||
* Return bucket number, or -1 if not found.
|
||||
*/
|
||||
static int
|
||||
findbucket(freep, srchlen)
|
||||
union overhead *freep;
|
||||
int srchlen;
|
||||
findbucket(union overhead *freep, int srchlen)
|
||||
{
|
||||
register union overhead *p;
|
||||
register int i, j;
|
||||
union overhead *p;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < NBUCKETS; i++) {
|
||||
j = 0;
|
||||
@ -439,11 +432,10 @@ findbucket(freep, srchlen)
|
||||
* for each size category, the second showing the number of mallocs -
|
||||
* frees for each size category.
|
||||
*/
|
||||
mstats(s)
|
||||
char *s;
|
||||
mstats(char * s)
|
||||
{
|
||||
register int i, j;
|
||||
register union overhead *p;
|
||||
int i, j;
|
||||
union overhead *p;
|
||||
int totfree = 0,
|
||||
totused = 0;
|
||||
|
||||
@ -466,8 +458,7 @@ mstats(s)
|
||||
|
||||
|
||||
static int
|
||||
morepages(n)
|
||||
int n;
|
||||
morepages(int n)
|
||||
{
|
||||
int fd = -1;
|
||||
int offset;
|
||||
|
@ -93,6 +93,7 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
Elf_Addr note_end;
|
||||
char *note_map;
|
||||
size_t note_map_len;
|
||||
Elf_Addr text_end;
|
||||
|
||||
hdr = get_elf_header(fd, path, sb);
|
||||
if (hdr == NULL)
|
||||
@ -103,7 +104,7 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
*
|
||||
* We expect that the loadable segments are ordered by load address.
|
||||
*/
|
||||
phdr = (Elf_Phdr *) ((char *)hdr + hdr->e_phoff);
|
||||
phdr = (Elf_Phdr *)((char *)hdr + hdr->e_phoff);
|
||||
phsize = hdr->e_phnum * sizeof (phdr[0]);
|
||||
phlimit = phdr + hdr->e_phnum;
|
||||
nsegs = -1;
|
||||
@ -114,8 +115,10 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
note_start = 0;
|
||||
note_end = 0;
|
||||
note_map = NULL;
|
||||
note_map_len = 0;
|
||||
segs = alloca(sizeof(segs[0]) * hdr->e_phnum);
|
||||
stack_flags = RTLD_DEFAULT_STACK_PF_EXEC | PF_R | PF_W;
|
||||
text_end = 0;
|
||||
while (phdr < phlimit) {
|
||||
switch (phdr->p_type) {
|
||||
|
||||
@ -130,6 +133,10 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
path, nsegs);
|
||||
goto error;
|
||||
}
|
||||
if ((segs[nsegs]->p_flags & PF_X) == PF_X) {
|
||||
text_end = MAX(text_end,
|
||||
round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_memsz));
|
||||
}
|
||||
break;
|
||||
|
||||
case PT_PHDR:
|
||||
@ -280,15 +287,13 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
}
|
||||
obj->mapbase = mapbase;
|
||||
obj->mapsize = mapsize;
|
||||
obj->textsize = round_page(segs[0]->p_vaddr + segs[0]->p_memsz) -
|
||||
base_vaddr;
|
||||
obj->vaddrbase = base_vaddr;
|
||||
obj->relocbase = mapbase - base_vaddr;
|
||||
obj->dynamic = (const Elf_Dyn *) (obj->relocbase + phdyn->p_vaddr);
|
||||
obj->dynamic = (const Elf_Dyn *)(obj->relocbase + phdyn->p_vaddr);
|
||||
if (hdr->e_entry != 0)
|
||||
obj->entry = (caddr_t) (obj->relocbase + hdr->e_entry);
|
||||
obj->entry = (caddr_t)(obj->relocbase + hdr->e_entry);
|
||||
if (phdr_vaddr != 0) {
|
||||
obj->phdr = (const Elf_Phdr *) (obj->relocbase + phdr_vaddr);
|
||||
obj->phdr = (const Elf_Phdr *)(obj->relocbase + phdr_vaddr);
|
||||
} else {
|
||||
obj->phdr = malloc(phsize);
|
||||
if (obj->phdr == NULL) {
|
||||
@ -296,12 +301,12 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
_rtld_error("%s: cannot allocate program header", path);
|
||||
goto error1;
|
||||
}
|
||||
memcpy((char *)obj->phdr, (char *)hdr + hdr->e_phoff, phsize);
|
||||
memcpy(__DECONST(char *, obj->phdr), (char *)hdr + hdr->e_phoff, phsize);
|
||||
obj->phdr_alloc = true;
|
||||
}
|
||||
obj->phsize = phsize;
|
||||
if (phinterp != NULL)
|
||||
obj->interp = (const char *) (obj->relocbase + phinterp->p_vaddr);
|
||||
obj->interp = (const char *)(obj->relocbase + phinterp->p_vaddr);
|
||||
if (phtls != NULL) {
|
||||
tls_dtv_generation++;
|
||||
obj->tlsindex = ++tls_max_index;
|
||||
@ -335,7 +340,7 @@ get_elf_header(int fd, const char *path, const struct stat *sbp)
|
||||
Elf_Ehdr *hdr;
|
||||
|
||||
/* Make sure file has enough data for the ELF header */
|
||||
if (sbp != NULL && sbp->st_size < sizeof(Elf_Ehdr)) {
|
||||
if (sbp != NULL && sbp->st_size < (off_t)sizeof(Elf_Ehdr)) {
|
||||
_rtld_error("%s: invalid file format", path);
|
||||
return (NULL);
|
||||
}
|
||||
@ -425,13 +430,13 @@ obj_free(Obj_Entry *obj)
|
||||
if (obj->origin_path)
|
||||
free(obj->origin_path);
|
||||
if (obj->z_origin)
|
||||
free(obj->rpath);
|
||||
free(__DECONST(void*, obj->rpath));
|
||||
if (obj->priv)
|
||||
free(obj->priv);
|
||||
if (obj->path)
|
||||
free(obj->path);
|
||||
if (obj->phdr_alloc)
|
||||
free((void *)obj->phdr);
|
||||
free(__DECONST(void *, obj->phdr));
|
||||
free(obj);
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
*/
|
||||
assert(dstobj->mainprog);
|
||||
|
||||
rellim = (const Elf_Rel *)((caddr_t)dstobj->rel + dstobj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *)dstobj->rel + dstobj->relsize);
|
||||
for (rel = dstobj->rel; rel < rellim; rel++) {
|
||||
if (ELF_R_TYPE(rel->r_info) != R_MIPS_COPY)
|
||||
continue;
|
||||
@ -265,7 +265,7 @@ _rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
++got;
|
||||
}
|
||||
|
||||
rellim = (const Elf_Rel *)((caddr_t)rel + relsz);
|
||||
rellim = (const Elf_Rel *)((const char *)rel + relsz);
|
||||
for (; rel < rellim; rel++) {
|
||||
Elf_Word r_symndx, r_type;
|
||||
|
||||
@ -469,7 +469,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
}
|
||||
|
||||
got = obj->pltgot;
|
||||
rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->rel + obj->relsize);
|
||||
for (rel = obj->rel; rel < rellim; rel++) {
|
||||
Elf_Word r_symndx, r_type;
|
||||
void *where;
|
||||
@ -657,7 +657,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rel *rellim;
|
||||
const Elf_Rel *rel;
|
||||
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -687,7 +687,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
const Elf_Rel *rel;
|
||||
const Elf_Sym *def;
|
||||
|
||||
rellim = (const Elf_Rel *)((char *)obj->pltrel + obj->pltrelsize);
|
||||
rellim = (const Elf_Rel *)((const char *)obj->pltrel + obj->pltrelsize);
|
||||
for (rel = obj->pltrel; rel < rellim; rel++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -714,7 +714,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -722,8 +723,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -731,8 +732,9 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
}
|
||||
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const Obj_Entry *defobj __unused, const Obj_Entry *obj __unused,
|
||||
const Elf_Rel *rel)
|
||||
{
|
||||
|
||||
assert(ELF_R_TYPE(rel->r_info) == R_MIPS_JUMP_SLOT);
|
||||
|
@ -43,6 +43,9 @@ struct Struct_Obj_Entry;
|
||||
Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
|
||||
const Elf_Rel *rel);
|
||||
Elf_Addr _mips_rtld_bind(struct Struct_Obj_Entry *obj, Elf_Size reloff);
|
||||
void *_mips_get_tls(void);
|
||||
|
||||
|
||||
#define make_function_pointer(def, defobj) \
|
||||
((defobj)->relocbase + (def)->st_value)
|
||||
|
@ -69,10 +69,10 @@
|
||||
#define SOFT_STANDARD_LIBRARY_PATH "/usr/libsoft"
|
||||
#define LD_SOFT_ "LD_SOFT_"
|
||||
|
||||
extern char *ld_elf_hints_default;
|
||||
extern char *ld_path_libmap_conf;
|
||||
extern char *ld_path_rtld;
|
||||
extern char *ld_standard_library_path;
|
||||
extern char *ld_env_prefix;
|
||||
extern const char *ld_elf_hints_default;
|
||||
extern const char *ld_path_libmap_conf;
|
||||
extern const char *ld_path_rtld;
|
||||
extern const char *ld_standard_library_path;
|
||||
extern const char *ld_env_prefix;
|
||||
|
||||
#endif /* PATHS_H */
|
||||
|
@ -71,7 +71,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
*/
|
||||
assert(dstobj->mainprog);
|
||||
|
||||
relalim = (const Elf_Rela *) ((caddr_t) dstobj->rela +
|
||||
relalim = (const Elf_Rela *)((const char *) dstobj->rela +
|
||||
dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
void *dstaddr;
|
||||
@ -88,7 +88,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
continue;
|
||||
}
|
||||
|
||||
dstaddr = (void *) (dstobj->relocbase + rela->r_offset);
|
||||
dstaddr = (void *)(dstobj->relocbase + rela->r_offset);
|
||||
dstsym = dstobj->symtab + ELF_R_SYM(rela->r_info);
|
||||
name = dstobj->strtab + dstsym->st_name;
|
||||
size = dstsym->st_size;
|
||||
@ -113,7 +113,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
srcaddr = (const void *) (defobj->relocbase+srcsym->st_value);
|
||||
srcaddr = (const void *)(defobj->relocbase+srcsym->st_value);
|
||||
memcpy(dstaddr, srcaddr, size);
|
||||
dbg("copy_reloc: src=%p,dst=%p,size=%d\n",srcaddr,dstaddr,size);
|
||||
}
|
||||
@ -149,7 +149,7 @@ reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
/*
|
||||
* Relocate these values
|
||||
*/
|
||||
relalim = (const Elf_Rela *)((caddr_t)rela + relasz);
|
||||
relalim = (const Elf_Rela *)((const char *)rela + relasz);
|
||||
for (; rela < relalim; rela++) {
|
||||
where = (Elf_Addr *)(relocbase + rela->r_offset);
|
||||
*where = (Elf_Addr)(relocbase + rela->r_addend);
|
||||
@ -161,8 +161,8 @@ reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
* Relocate a non-PLT object with addend.
|
||||
*/
|
||||
static int
|
||||
reloc_nonplt_object(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela,
|
||||
SymCache *cache, int flags, RtldLockState *lockstate)
|
||||
reloc_nonplt_object(Obj_Entry *obj_rtld __unused, Obj_Entry *obj,
|
||||
const Elf_Rela *rela, SymCache *cache, int flags, RtldLockState *lockstate)
|
||||
{
|
||||
Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
const Elf_Sym *def;
|
||||
@ -249,7 +249,8 @@ reloc_nonplt_object(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela,
|
||||
* error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available for static "
|
||||
"Thread Local Storage", obj->path);
|
||||
return (-1);
|
||||
@ -293,6 +294,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
{
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
const Elf_Phdr *phdr;
|
||||
SymCache *cache;
|
||||
int r = -1;
|
||||
|
||||
@ -315,7 +317,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* "The PowerPC family uses only the Elf32_Rela relocation
|
||||
* entries with explicit addends."
|
||||
*/
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
if (reloc_nonplt_object(obj_rtld, obj, rela, cache, flags,
|
||||
lockstate) < 0)
|
||||
@ -326,8 +328,18 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
if (cache != NULL)
|
||||
free(cache);
|
||||
|
||||
/* Synchronize icache for text seg in case we made any changes */
|
||||
__syncicache(obj->mapbase, obj->textsize);
|
||||
/*
|
||||
* Synchronize icache for executable segments in case we made
|
||||
* any changes.
|
||||
*/
|
||||
for (phdr = obj->phdr;
|
||||
(const char *)phdr < (const char *)obj->phdr + obj->phsize;
|
||||
phdr++) {
|
||||
if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) {
|
||||
__syncicache(obj->relocbase + phdr->p_vaddr,
|
||||
phdr->p_memsz);
|
||||
}
|
||||
}
|
||||
|
||||
return (r);
|
||||
}
|
||||
@ -398,7 +410,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
|
||||
if (obj->pltrelasize != 0) {
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela +
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
assert(ELF_R_TYPE(rela->r_info) == R_PPC_JMP_SLOT);
|
||||
@ -433,7 +445,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
Elf_Addr *where;
|
||||
Elf_Addr target;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
assert(ELF_R_TYPE(rela->r_info) == R_PPC_JMP_SLOT);
|
||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
@ -469,8 +482,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
* trampoline call and jump table.
|
||||
*/
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target,
|
||||
const Obj_Entry *defobj __unused, const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
{
|
||||
Elf_Addr offset;
|
||||
const Elf_Rela *rela = (const Elf_Rela *) rel;
|
||||
@ -529,7 +542,8 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -537,8 +551,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -650,7 +664,7 @@ allocate_initial_tls(Obj_Entry *list)
|
||||
|
||||
tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA;
|
||||
|
||||
tp = (Elf_Addr **) ((char *) allocate_tls(list, NULL, TLS_TCB_SIZE, 8)
|
||||
tp = (Elf_Addr **)((char *) allocate_tls(list, NULL, TLS_TCB_SIZE, 8)
|
||||
+ TLS_TP_OFFSET + TLS_TCB_SIZE);
|
||||
|
||||
/*
|
||||
|
@ -42,6 +42,7 @@ struct Struct_Obj_Entry;
|
||||
Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
|
||||
const Elf_Rel *rel);
|
||||
void reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase);
|
||||
|
||||
#define make_function_pointer(def, defobj) \
|
||||
((defobj)->relocbase + (def)->st_value)
|
||||
|
@ -67,7 +67,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
*/
|
||||
assert(dstobj->mainprog);
|
||||
|
||||
relalim = (const Elf_Rela *) ((caddr_t) dstobj->rela +
|
||||
relalim = (const Elf_Rela *)((const char *) dstobj->rela +
|
||||
dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
void *dstaddr;
|
||||
@ -84,7 +84,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
continue;
|
||||
}
|
||||
|
||||
dstaddr = (void *) (dstobj->relocbase + rela->r_offset);
|
||||
dstaddr = (void *)(dstobj->relocbase + rela->r_offset);
|
||||
dstsym = dstobj->symtab + ELF_R_SYM(rela->r_info);
|
||||
name = dstobj->strtab + dstsym->st_name;
|
||||
size = dstsym->st_size;
|
||||
@ -109,7 +109,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
srcaddr = (const void *) (defobj->relocbase+srcsym->st_value);
|
||||
srcaddr = (const void *)(defobj->relocbase+srcsym->st_value);
|
||||
memcpy(dstaddr, srcaddr, size);
|
||||
dbg("copy_reloc: src=%p,dst=%p,size=%zd\n",srcaddr,dstaddr,size);
|
||||
}
|
||||
@ -145,7 +145,7 @@ reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
/*
|
||||
* Relocate these values
|
||||
*/
|
||||
relalim = (const Elf_Rela *)((caddr_t)rela + relasz);
|
||||
relalim = (const Elf_Rela *)((const char *)rela + relasz);
|
||||
for (; rela < relalim; rela++) {
|
||||
where = (Elf_Addr *)(relocbase + rela->r_offset);
|
||||
*where = (Elf_Addr)(relocbase + rela->r_addend);
|
||||
@ -157,8 +157,8 @@ reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
|
||||
* Relocate a non-PLT object with addend.
|
||||
*/
|
||||
static int
|
||||
reloc_nonplt_object(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela,
|
||||
SymCache *cache, int flags, RtldLockState *lockstate)
|
||||
reloc_nonplt_object(Obj_Entry *obj_rtld __unused, Obj_Entry *obj,
|
||||
const Elf_Rela *rela, SymCache *cache, int flags, RtldLockState *lockstate)
|
||||
{
|
||||
Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
const Elf_Sym *def;
|
||||
@ -246,7 +246,8 @@ reloc_nonplt_object(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela,
|
||||
* error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available for static "
|
||||
"Thread Local Storage", obj->path);
|
||||
return (-1);
|
||||
@ -290,6 +291,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
{
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
const Elf_Phdr *phdr;
|
||||
SymCache *cache;
|
||||
int bytes = obj->dynsymcount * sizeof(SymCache);
|
||||
int r = -1;
|
||||
@ -315,7 +317,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* "The PowerPC family uses only the Elf32_Rela relocation
|
||||
* entries with explicit addends."
|
||||
*/
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
if (reloc_nonplt_object(obj_rtld, obj, rela, cache, flags,
|
||||
lockstate) < 0)
|
||||
@ -326,8 +328,18 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
if (cache)
|
||||
munmap(cache, bytes);
|
||||
|
||||
/* Synchronize icache for text seg in case we made any changes */
|
||||
__syncicache(obj->mapbase, obj->textsize);
|
||||
/*
|
||||
* Synchronize icache for executable segments in case we made
|
||||
* any changes.
|
||||
*/
|
||||
for (phdr = obj->phdr;
|
||||
(const char *)phdr < (const char *)obj->phdr + obj->phsize;
|
||||
phdr++) {
|
||||
if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) {
|
||||
__syncicache(obj->relocbase + phdr->p_vaddr,
|
||||
phdr->p_memsz);
|
||||
}
|
||||
}
|
||||
|
||||
return (r);
|
||||
}
|
||||
@ -370,7 +382,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rela *rela;
|
||||
|
||||
if (obj->pltrelasize != 0) {
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela +
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
assert(ELF_R_TYPE(rela->r_info) == R_PPC_JMP_SLOT);
|
||||
@ -398,7 +410,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
Elf_Addr *where;
|
||||
Elf_Addr target;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
assert(ELF_R_TYPE(rela->r_info) == R_PPC_JMP_SLOT);
|
||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
@ -435,7 +448,7 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
*/
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
const Obj_Entry *obj __unused, const Elf_Rel *rel __unused)
|
||||
{
|
||||
|
||||
/*
|
||||
@ -494,7 +507,8 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -502,8 +516,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -555,7 +569,7 @@ allocate_initial_tls(Obj_Entry *list)
|
||||
|
||||
tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA;
|
||||
|
||||
tp = (Elf_Addr **) ((char *)allocate_tls(list, NULL, TLS_TCB_SIZE, 16)
|
||||
tp = (Elf_Addr **)((char *)allocate_tls(list, NULL, TLS_TCB_SIZE, 16)
|
||||
+ TLS_TP_OFFSET + TLS_TCB_SIZE);
|
||||
|
||||
__asm __volatile("mr 13,%0" :: "r"(tp));
|
||||
|
@ -42,6 +42,7 @@ struct Struct_Obj_Entry;
|
||||
Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
|
||||
const Elf_Rel *rel);
|
||||
void reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase);
|
||||
|
||||
#define make_function_pointer(def, defobj) \
|
||||
((defobj)->relocbase + (def)->st_value)
|
||||
|
@ -50,8 +50,6 @@ __FBSDID("$FreeBSD$");
|
||||
#define RELOC_ALIGNED_P(x) \
|
||||
(((uintptr_t)(x) & (sizeof(void *) - 1)) == 0)
|
||||
|
||||
void _exit(int);
|
||||
|
||||
uint64_t
|
||||
set_gp(Obj_Entry *obj)
|
||||
{
|
||||
@ -105,7 +103,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
*/
|
||||
assert(dstobj->mainprog);
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)dstobj->rela +
|
||||
relalim = (const Elf_Rela *)((const char *)dstobj->rela +
|
||||
dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) != R_RISCV_COPY)
|
||||
@ -152,7 +150,8 @@ reloc_plt(Obj_Entry *obj)
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -176,7 +175,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
const Elf_Rela *rela;
|
||||
const Elf_Sym *def;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
Elf_Addr *where;
|
||||
|
||||
@ -203,7 +203,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -211,8 +212,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -220,8 +221,9 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
}
|
||||
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
|
||||
const Obj_Entry *obj, const Elf_Rel *rel)
|
||||
reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
||||
const Obj_Entry *defobj __unused, const Obj_Entry *obj __unused,
|
||||
const Elf_Rel *rel)
|
||||
{
|
||||
|
||||
assert(ELF_R_TYPE(rel->r_info) == R_RISCV_JUMP_SLOT);
|
||||
@ -260,7 +262,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
cache = calloc(obj->dynsymcount, sizeof(SymCache));
|
||||
/* No need to check for NULL here */
|
||||
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
symnum = ELF_R_SYM(rela->r_info);
|
||||
@ -315,7 +317,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error(
|
||||
"%s: No space available for static "
|
||||
"Thread Local Storage", obj->path);
|
||||
@ -341,7 +344,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
* error.
|
||||
*/
|
||||
if (!defobj->tls_done) {
|
||||
if (!allocate_tls_offset((Obj_Entry*) defobj)) {
|
||||
if (!allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error(
|
||||
"%s: No space available for static "
|
||||
"Thread Local Storage", obj->path);
|
||||
@ -390,7 +394,7 @@ allocate_initial_tls(Obj_Entry *objs)
|
||||
tls_static_space = tls_last_offset + tls_last_size +
|
||||
RTLD_STATIC_TLS_EXTRA;
|
||||
|
||||
tp = (Elf_Addr **) ((char *)allocate_tls(objs, NULL, TLS_TCB_SIZE, 16)
|
||||
tp = (Elf_Addr **)((char *)allocate_tls(objs, NULL, TLS_TCB_SIZE, 16)
|
||||
+ TLS_TP_OFFSET + TLS_TCB_SIZE);
|
||||
|
||||
__asm __volatile("mv tp, %0" :: "r"(tp));
|
||||
@ -407,5 +411,5 @@ __tls_get_addr(tls_index* ti)
|
||||
p = tls_get_addr_common((Elf_Addr**)((Elf_Addr)_tp - TLS_TP_OFFSET
|
||||
- TLS_TCB_SIZE), ti->ti_module, ti->ti_offset);
|
||||
|
||||
return (p + TLS_DTV_OFFSET);
|
||||
return ((char*)p + TLS_DTV_OFFSET);
|
||||
}
|
||||
|
@ -70,9 +70,17 @@ __FBSDID("$FreeBSD$");
|
||||
#include "notes.h"
|
||||
|
||||
/* Types. */
|
||||
typedef void (*func_ptr_type)();
|
||||
typedef void (*func_ptr_type)(void);
|
||||
typedef void * (*path_enum_proc) (const char *path, size_t len, void *arg);
|
||||
|
||||
|
||||
/* Variables that cannot be static: */
|
||||
extern struct r_debug r_debug; /* For GDB */
|
||||
extern int _thread_autoinit_dummy_decl;
|
||||
extern char* __progname;
|
||||
extern void (*__cleanup)(void);
|
||||
|
||||
|
||||
/*
|
||||
* Function declarations.
|
||||
*/
|
||||
@ -159,7 +167,7 @@ static void unref_dag(Obj_Entry *);
|
||||
static void ref_dag(Obj_Entry *);
|
||||
static char *origin_subst_one(Obj_Entry *, char *, const char *,
|
||||
const char *, bool);
|
||||
static char *origin_subst(Obj_Entry *, char *);
|
||||
static char *origin_subst(Obj_Entry *, const char *);
|
||||
static bool obj_resolve_origin(Obj_Entry *obj);
|
||||
static void preinit_main(void);
|
||||
static int rtld_verify_versions(const Objlist *);
|
||||
@ -196,8 +204,8 @@ static char *ld_library_path; /* Environment variable for search path */
|
||||
static char *ld_library_dirs; /* Environment variable for library descriptors */
|
||||
static char *ld_preload; /* Environment variable for libraries to
|
||||
load first */
|
||||
static char *ld_elf_hints_path; /* Environment variable for alternative hints path */
|
||||
static char *ld_tracing; /* Called from ldd to print libs */
|
||||
static const char *ld_elf_hints_path; /* Environment variable for alternative hints path */
|
||||
static const char *ld_tracing; /* Called from ldd to print libs */
|
||||
static char *ld_utrace; /* Use utrace() to log events. */
|
||||
static struct obj_entry_q obj_list; /* Queue of all loaded objects */
|
||||
static Obj_Entry *obj_main; /* The main program shared object */
|
||||
@ -236,7 +244,15 @@ int _rtld_get_stack_prot(void) __exported;
|
||||
int _rtld_is_dlopened(void *) __exported;
|
||||
void _rtld_error(const char *, ...) __exported;
|
||||
|
||||
int npagesizes, osreldate;
|
||||
/* Only here to fix -Wmissing-prototypes warnings */
|
||||
int __getosreldate(void);
|
||||
void __pthread_cxa_finalize(struct dl_phdr_info *a);
|
||||
func_ptr_type _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp);
|
||||
Elf_Addr _rtld_bind(Obj_Entry *obj, Elf_Size reloff);
|
||||
|
||||
|
||||
int npagesizes;
|
||||
static int osreldate;
|
||||
size_t *pagesizes;
|
||||
|
||||
static int stack_prot = PROT_READ | PROT_WRITE | RTLD_DEFAULT_STACK_EXEC;
|
||||
@ -261,20 +277,20 @@ char **main_argv;
|
||||
size_t tls_last_offset; /* Static TLS offset of last module */
|
||||
size_t tls_last_size; /* Static TLS size of last module */
|
||||
size_t tls_static_space; /* Static TLS space allocated */
|
||||
size_t tls_static_max_align;
|
||||
int tls_dtv_generation = 1; /* Used to detect when dtv size changes */
|
||||
static size_t tls_static_max_align;
|
||||
Elf_Addr tls_dtv_generation = 1; /* Used to detect when dtv size changes */
|
||||
int tls_max_index = 1; /* Largest module index allocated */
|
||||
|
||||
bool ld_library_path_rpath = false;
|
||||
static bool ld_library_path_rpath = false;
|
||||
|
||||
/*
|
||||
* Globals for path names, and such
|
||||
*/
|
||||
char *ld_elf_hints_default = _PATH_ELF_HINTS;
|
||||
char *ld_path_libmap_conf = _PATH_LIBMAP_CONF;
|
||||
char *ld_path_rtld = _PATH_RTLD;
|
||||
char *ld_standard_library_path = STANDARD_LIBRARY_PATH;
|
||||
char *ld_env_prefix = LD_;
|
||||
const char *ld_elf_hints_default = _PATH_ELF_HINTS;
|
||||
const char *ld_path_libmap_conf = _PATH_LIBMAP_CONF;
|
||||
const char *ld_path_rtld = _PATH_RTLD;
|
||||
const char *ld_standard_library_path = STANDARD_LIBRARY_PATH;
|
||||
const char *ld_env_prefix = LD_;
|
||||
|
||||
/*
|
||||
* Fill in a DoneList with an allocation large enough to hold all of
|
||||
@ -356,7 +372,8 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
RtldLockState lockstate;
|
||||
struct stat st;
|
||||
Elf_Addr *argcp;
|
||||
char **argv, *argv0, **env, **envp, *kexecpath, *library_path_rpath;
|
||||
char **argv, **env, **envp, *kexecpath, *library_path_rpath;
|
||||
const char *argv0;
|
||||
caddr_t imgentry;
|
||||
char buf[MAXPATHLEN];
|
||||
int argc, fd, i, phnum, rtld_argc;
|
||||
@ -692,6 +709,8 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
exit (0);
|
||||
}
|
||||
|
||||
ifunc_init(aux);
|
||||
|
||||
/*
|
||||
* Setup TLS for main thread. This must be done after the
|
||||
* relocations are processed, since tls initialization section
|
||||
@ -713,7 +732,6 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
r_debug_state(NULL, &obj_main->linkmap); /* say hello to gdb! */
|
||||
|
||||
map_stacks_exec(NULL);
|
||||
ifunc_init(aux);
|
||||
|
||||
dbg("resolving ifuncs");
|
||||
if (resolve_objects_ifunc(obj_main,
|
||||
@ -790,11 +808,11 @@ _rtld_bind(Obj_Entry *obj, Elf_Size reloff)
|
||||
if (sigsetjmp(lockstate.env, 0) != 0)
|
||||
lock_upgrade(rtld_bind_lock, &lockstate);
|
||||
if (obj->pltrel)
|
||||
rel = (const Elf_Rel *) ((caddr_t) obj->pltrel + reloff);
|
||||
rel = (const Elf_Rel *)((const char *)obj->pltrel + reloff);
|
||||
else
|
||||
rel = (const Elf_Rel *) ((caddr_t) obj->pltrela + reloff);
|
||||
rel = (const Elf_Rel *)((const char *)obj->pltrela + reloff);
|
||||
|
||||
where = (Elf_Addr *) (obj->relocbase + rel->r_offset);
|
||||
where = (Elf_Addr *)(obj->relocbase + rel->r_offset);
|
||||
def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, SYMLOOK_IN_PLT,
|
||||
NULL, &lockstate);
|
||||
if (def == NULL)
|
||||
@ -937,7 +955,7 @@ origin_subst_one(Obj_Entry *obj, char *real, const char *kw,
|
||||
}
|
||||
|
||||
static char *
|
||||
origin_subst(Obj_Entry *obj, char *real)
|
||||
origin_subst(Obj_Entry *obj, const char *real)
|
||||
{
|
||||
char *res1, *res2, *res3, *res4;
|
||||
|
||||
@ -949,7 +967,9 @@ origin_subst(Obj_Entry *obj, char *real)
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
res1 = origin_subst_one(obj, real, "$ORIGIN", NULL, false);
|
||||
/* __DECONST is safe here since without may_free real is unchanged */
|
||||
res1 = origin_subst_one(obj, __DECONST(char *, real), "$ORIGIN", NULL,
|
||||
false);
|
||||
res2 = origin_subst_one(NULL, res1, "$OSNAME", uts.sysname, true);
|
||||
res3 = origin_subst_one(NULL, res2, "$OSREL", uts.release, true);
|
||||
res4 = origin_subst_one(NULL, res3, "$PLATFORM", uts.machine, true);
|
||||
@ -996,7 +1016,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
switch (dynp->d_tag) {
|
||||
|
||||
case DT_REL:
|
||||
obj->rel = (const Elf_Rel *) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->rel = (const Elf_Rel *)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_RELSZ:
|
||||
@ -1017,7 +1037,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_RELA:
|
||||
obj->rela = (const Elf_Rela *) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->rela = (const Elf_Rela *)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_RELASZ:
|
||||
@ -1043,7 +1063,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_STRTAB:
|
||||
obj->strtab = (const char *) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->strtab = (const char *)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_STRSZ:
|
||||
@ -1051,7 +1071,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_VERNEED:
|
||||
obj->verneed = (const Elf_Verneed *) (obj->relocbase +
|
||||
obj->verneed = (const Elf_Verneed *)(obj->relocbase +
|
||||
dynp->d_un.d_val);
|
||||
break;
|
||||
|
||||
@ -1060,7 +1080,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_VERDEF:
|
||||
obj->verdef = (const Elf_Verdef *) (obj->relocbase +
|
||||
obj->verdef = (const Elf_Verdef *)(obj->relocbase +
|
||||
dynp->d_un.d_val);
|
||||
break;
|
||||
|
||||
@ -1096,7 +1116,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
bloom_size32 = (__ELF_WORD_SIZE / 32) * nmaskwords;
|
||||
obj->maskwords_bm_gnu = nmaskwords - 1;
|
||||
obj->shift2_gnu = hashtab[3];
|
||||
obj->bloom_gnu = (Elf_Addr *) (hashtab + 4);
|
||||
obj->bloom_gnu = (const Elf_Addr *)(hashtab + 4);
|
||||
obj->buckets_gnu = hashtab + 4 + bloom_size32;
|
||||
obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu -
|
||||
obj->symndx_gnu;
|
||||
@ -1143,7 +1163,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_PLTGOT:
|
||||
obj->pltgot = (Elf_Addr *) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->pltgot = (Elf_Addr *)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_TEXTREL:
|
||||
@ -1171,7 +1191,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_INIT:
|
||||
obj->init = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->init = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_PREINIT_ARRAY:
|
||||
@ -1191,7 +1211,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_FINI:
|
||||
obj->fini = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->fini = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
case DT_FINI_ARRAY:
|
||||
@ -1211,7 +1231,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
case DT_DEBUG:
|
||||
if (!early)
|
||||
dbg("Filling in DT_DEBUG entry");
|
||||
((Elf_Dyn*)dynp)->d_un.d_ptr = (Elf_Addr) &r_debug;
|
||||
(__DECONST(Elf_Dyn *, dynp))->d_un.d_ptr = (Elf_Addr)&r_debug;
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -1245,7 +1265,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
break;
|
||||
|
||||
case DT_MIPS_PLTGOT:
|
||||
obj->mips_pltgot = (Elf_Addr *) (obj->relocbase +
|
||||
obj->mips_pltgot = (Elf_Addr *)(obj->relocbase +
|
||||
dynp->d_un.d_ptr);
|
||||
break;
|
||||
|
||||
@ -1253,7 +1273,7 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
|
||||
#ifdef __powerpc64__
|
||||
case DT_PPC64_GLINK:
|
||||
obj->glink = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr);
|
||||
obj->glink = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -1330,10 +1350,10 @@ digest_dynamic2(Obj_Entry *obj, const Elf_Dyn *dyn_rpath,
|
||||
rtld_die();
|
||||
|
||||
if (dyn_runpath != NULL) {
|
||||
obj->runpath = (char *)obj->strtab + dyn_runpath->d_un.d_val;
|
||||
obj->runpath = (const char *)obj->strtab + dyn_runpath->d_un.d_val;
|
||||
obj->runpath = origin_subst(obj, obj->runpath);
|
||||
} else if (dyn_rpath != NULL) {
|
||||
obj->rpath = (char *)obj->strtab + dyn_rpath->d_un.d_val;
|
||||
obj->rpath = (const char *)obj->strtab + dyn_rpath->d_un.d_val;
|
||||
obj->rpath = origin_subst(obj, obj->rpath);
|
||||
}
|
||||
if (dyn_soname != NULL)
|
||||
@ -1373,7 +1393,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
|
||||
obj->phdr = phdr;
|
||||
obj->phsize = ph->p_memsz;
|
||||
obj->relocbase = (caddr_t)phdr - ph->p_vaddr;
|
||||
obj->relocbase = __DECONST(char *, phdr) - ph->p_vaddr;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1390,8 +1410,6 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
if (nsegs == 0) { /* First load segment */
|
||||
obj->vaddrbase = trunc_page(ph->p_vaddr);
|
||||
obj->mapbase = obj->vaddrbase + obj->relocbase;
|
||||
obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) -
|
||||
obj->vaddrbase;
|
||||
} else { /* Last load segment */
|
||||
obj->mapsize = round_page(ph->p_vaddr + ph->p_memsz) -
|
||||
obj->vaddrbase;
|
||||
@ -1577,14 +1595,15 @@ gnu_hash(const char *s)
|
||||
static char *
|
||||
find_library(const char *xname, const Obj_Entry *refobj, int *fdp)
|
||||
{
|
||||
char *name, *pathname, *refobj_path;
|
||||
char *pathname, *refobj_path;
|
||||
const char *name;
|
||||
bool nodeflib, objgiven;
|
||||
|
||||
objgiven = refobj != NULL;
|
||||
|
||||
if (libmap_disable || !objgiven ||
|
||||
(name = lm_find(refobj->path, xname)) == NULL)
|
||||
name = (char *)xname;
|
||||
name = xname;
|
||||
|
||||
if (strchr(name, '/') != NULL) { /* Hard coded pathname */
|
||||
if (name[0] != '/' && !trust) {
|
||||
@ -1773,7 +1792,8 @@ find_symdef(unsigned long symnum, const Obj_Entry *refobj,
|
||||
static const char *
|
||||
gethints(bool nostdlib)
|
||||
{
|
||||
static char *hints, *filtered_path;
|
||||
static char *filtered_path;
|
||||
static const char *hints;
|
||||
static struct elfhints_hdr hdr;
|
||||
struct fill_search_info_args sargs, hargs;
|
||||
struct dl_serinfo smeta, hmeta, *SLPinfo, *hintinfo;
|
||||
@ -2509,7 +2529,7 @@ obj_from_addr(const void *addr)
|
||||
continue;
|
||||
if (addr < (void *) obj->mapbase)
|
||||
continue;
|
||||
if (addr < (void *) (obj->mapbase + obj->mapsize))
|
||||
if (addr < (void *)(obj->mapbase + obj->mapsize))
|
||||
return obj;
|
||||
}
|
||||
return NULL;
|
||||
@ -3206,12 +3226,12 @@ dlerror(void)
|
||||
*/
|
||||
void
|
||||
dllockinit(void *context,
|
||||
void *(*lock_create)(void *context),
|
||||
void (*rlock_acquire)(void *lock),
|
||||
void (*wlock_acquire)(void *lock),
|
||||
void (*lock_release)(void *lock),
|
||||
void (*lock_destroy)(void *lock),
|
||||
void (*context_destroy)(void *context))
|
||||
void *(*_lock_create)(void *context) __unused,
|
||||
void (*_rlock_acquire)(void *lock) __unused,
|
||||
void (*_wlock_acquire)(void *lock) __unused,
|
||||
void (*_lock_release)(void *lock) __unused,
|
||||
void (*_lock_destroy)(void *lock) __unused,
|
||||
void (*context_destroy)(void *context))
|
||||
{
|
||||
static void *cur_context;
|
||||
static void (*cur_context_destroy)(void *);
|
||||
@ -3249,7 +3269,7 @@ rtld_dlopen(const char *name, int fd, int mode)
|
||||
rlock_acquire(rtld_bind_lock, &lockstate);
|
||||
if (sigsetjmp(lockstate.env, 0) != 0)
|
||||
lock_upgrade(rtld_bind_lock, &lockstate);
|
||||
environ = (char **)*get_program_var_addr("environ", &lockstate);
|
||||
environ = __DECONST(char **, *get_program_var_addr("environ", &lockstate));
|
||||
lock_release(rtld_bind_lock, &lockstate);
|
||||
}
|
||||
lo_flags = RTLD_LO_DLOPEN;
|
||||
@ -3962,7 +3982,7 @@ linkmap_delete(Obj_Entry *obj)
|
||||
* +0 RetAddr
|
||||
*/
|
||||
void
|
||||
r_debug_state(struct r_debug* rd, struct link_map *m)
|
||||
r_debug_state(struct r_debug* rd __unused, struct link_map *m __unused)
|
||||
{
|
||||
/*
|
||||
* The following is a hack to force the compiler to emit calls to
|
||||
@ -3980,7 +4000,7 @@ r_debug_state(struct r_debug* rd, struct link_map *m)
|
||||
* main is not available in the symbol table.
|
||||
*/
|
||||
void
|
||||
_r_debug_postinit(struct link_map *m)
|
||||
_r_debug_postinit(struct link_map *m __unused)
|
||||
{
|
||||
|
||||
/* See r_debug_state(). */
|
||||
@ -4301,8 +4321,8 @@ matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result,
|
||||
else if (((req->flags & SYMLOOK_IN_PLT) == 0) &&
|
||||
(ELF_ST_TYPE(symp->st_info) == STT_FUNC))
|
||||
break;
|
||||
/* fallthrough */
|
||||
#endif
|
||||
/* fallthrough */
|
||||
default:
|
||||
return (false);
|
||||
}
|
||||
@ -4471,8 +4491,8 @@ symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj)
|
||||
static void
|
||||
trace_loaded_objects(Obj_Entry *obj)
|
||||
{
|
||||
char *fmt1, *fmt2, *fmt, *main_local, *list_containers;
|
||||
int c;
|
||||
const char *fmt1, *fmt2, *fmt, *main_local, *list_containers;
|
||||
int c;
|
||||
|
||||
if ((main_local = getenv(_LD("TRACE_LOADED_OBJECTS_PROGNAME"))) == NULL)
|
||||
main_local = "";
|
||||
@ -4486,9 +4506,9 @@ trace_loaded_objects(Obj_Entry *obj)
|
||||
list_containers = getenv(_LD("TRACE_LOADED_OBJECTS_ALL"));
|
||||
|
||||
for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
|
||||
Needed_Entry *needed;
|
||||
char *name, *path;
|
||||
bool is_lib;
|
||||
Needed_Entry *needed;
|
||||
const char *name, *path;
|
||||
bool is_lib;
|
||||
|
||||
if (obj->marker)
|
||||
continue;
|
||||
@ -4503,7 +4523,7 @@ trace_loaded_objects(Obj_Entry *obj)
|
||||
} else
|
||||
path = "not found";
|
||||
|
||||
name = (char *)obj->strtab + needed->name;
|
||||
name = obj->strtab + needed->name;
|
||||
is_lib = strncmp(name, "lib", 3) == 0; /* XXX - bogus */
|
||||
|
||||
fmt = is_lib ? fmt1 : fmt2;
|
||||
@ -4743,7 +4763,7 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
|
||||
char *tls_block;
|
||||
Elf_Addr *dtv, **tcb;
|
||||
Elf_Addr addr;
|
||||
int i;
|
||||
Elf_Addr i;
|
||||
size_t extra_size, maxalign, post_size, pre_size, tls_block_size;
|
||||
size_t tls_init_align;
|
||||
|
||||
@ -4791,7 +4811,7 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
|
||||
if (obj->tlsinitsize > 0)
|
||||
memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
|
||||
if (obj->tlssize > obj->tlsinitsize)
|
||||
memset((void*) (addr + obj->tlsinitsize), 0,
|
||||
memset((void*)(addr + obj->tlsinitsize), 0,
|
||||
obj->tlssize - obj->tlsinitsize);
|
||||
dtv[obj->tlsindex + 1] = addr;
|
||||
}
|
||||
@ -4802,7 +4822,7 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
|
||||
}
|
||||
|
||||
void
|
||||
free_tls(void *tcb, size_t tcbsize, size_t tcbalign)
|
||||
free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused)
|
||||
{
|
||||
Elf_Addr *dtv;
|
||||
Elf_Addr tlsstart, tlsend;
|
||||
@ -4844,7 +4864,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
|
||||
char *tls;
|
||||
Elf_Addr *dtv, *olddtv;
|
||||
Elf_Addr segbase, oldsegbase, addr;
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
ralign = tcbalign;
|
||||
if (tls_static_max_align > ralign)
|
||||
@ -4893,7 +4913,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
|
||||
if (obj->marker || obj->tlsoffset == 0)
|
||||
continue;
|
||||
addr = segbase - obj->tlsoffset;
|
||||
memset((void*) (addr + obj->tlsinitsize),
|
||||
memset((void*)(addr + obj->tlsinitsize),
|
||||
0, obj->tlssize - obj->tlsinitsize);
|
||||
if (obj->tlsinit)
|
||||
memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
|
||||
@ -4905,7 +4925,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
|
||||
}
|
||||
|
||||
void
|
||||
free_tls(void *tls, size_t tcbsize, size_t tcbalign)
|
||||
free_tls(void *tls, size_t tcbsize __unused, size_t tcbalign)
|
||||
{
|
||||
Elf_Addr* dtv;
|
||||
size_t size, ralign;
|
||||
@ -5121,13 +5141,13 @@ check_object_provided_version(Obj_Entry *refobj, const Obj_Entry *depobj,
|
||||
}
|
||||
if (vna->vna_hash == vd->vd_hash) {
|
||||
const Elf_Verdaux *aux = (const Elf_Verdaux *)
|
||||
((char *)vd + vd->vd_aux);
|
||||
((const char *)vd + vd->vd_aux);
|
||||
if (strcmp(vername, depobj->strtab + aux->vda_name) == 0)
|
||||
return (0);
|
||||
}
|
||||
if (vd->vd_next == 0)
|
||||
break;
|
||||
vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
|
||||
vd = (const Elf_Verdef *)((const char *)vd + vd->vd_next);
|
||||
}
|
||||
if (vna->vna_flags & VER_FLG_WEAK)
|
||||
return (0);
|
||||
@ -5163,18 +5183,18 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
obj->path, vn->vn_version);
|
||||
return (-1);
|
||||
}
|
||||
vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
|
||||
vna = (const Elf_Vernaux *)((const char *)vn + vn->vn_aux);
|
||||
for (;;) {
|
||||
vernum = VER_NEED_IDX(vna->vna_other);
|
||||
if (vernum > maxvernum)
|
||||
maxvernum = vernum;
|
||||
if (vna->vna_next == 0)
|
||||
break;
|
||||
vna = (const Elf_Vernaux *) ((char *)vna + vna->vna_next);
|
||||
vna = (const Elf_Vernaux *)((const char *)vna + vna->vna_next);
|
||||
}
|
||||
if (vn->vn_next == 0)
|
||||
break;
|
||||
vn = (const Elf_Verneed *) ((char *)vn + vn->vn_next);
|
||||
vn = (const Elf_Verneed *)((const char *)vn + vn->vn_next);
|
||||
}
|
||||
|
||||
vd = obj->verdef;
|
||||
@ -5189,7 +5209,7 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
maxvernum = vernum;
|
||||
if (vd->vd_next == 0)
|
||||
break;
|
||||
vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
|
||||
vd = (const Elf_Verdef *)((const char *)vd + vd->vd_next);
|
||||
}
|
||||
|
||||
if (maxvernum == 0)
|
||||
@ -5208,7 +5228,7 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
if ((vd->vd_flags & VER_FLG_BASE) == 0) {
|
||||
vernum = VER_DEF_IDX(vd->vd_ndx);
|
||||
assert(vernum <= maxvernum);
|
||||
vda = (const Elf_Verdaux *)((char *)vd + vd->vd_aux);
|
||||
vda = (const Elf_Verdaux *)((const char *)vd + vd->vd_aux);
|
||||
obj->vertab[vernum].hash = vd->vd_hash;
|
||||
obj->vertab[vernum].name = obj->strtab + vda->vda_name;
|
||||
obj->vertab[vernum].file = NULL;
|
||||
@ -5216,7 +5236,7 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
}
|
||||
if (vd->vd_next == 0)
|
||||
break;
|
||||
vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
|
||||
vd = (const Elf_Verdef *)((const char *)vd + vd->vd_next);
|
||||
}
|
||||
|
||||
vn = obj->verneed;
|
||||
@ -5224,7 +5244,7 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
depobj = locate_dependency(obj, obj->strtab + vn->vn_file);
|
||||
if (depobj == NULL)
|
||||
return (-1);
|
||||
vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
|
||||
vna = (const Elf_Vernaux *)((const char *)vn + vn->vn_aux);
|
||||
for (;;) {
|
||||
if (check_object_provided_version(obj, depobj, vna))
|
||||
return (-1);
|
||||
@ -5237,11 +5257,11 @@ rtld_verify_object_versions(Obj_Entry *obj)
|
||||
VER_INFO_HIDDEN : 0;
|
||||
if (vna->vna_next == 0)
|
||||
break;
|
||||
vna = (const Elf_Vernaux *) ((char *)vna + vna->vna_next);
|
||||
vna = (const Elf_Vernaux *)((const char *)vna + vna->vna_next);
|
||||
}
|
||||
if (vn->vn_next == 0)
|
||||
break;
|
||||
vn = (const Elf_Verneed *) ((char *)vn + vn->vn_next);
|
||||
vn = (const Elf_Verneed *)((const char *)vn + vn->vn_next);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -5568,7 +5588,7 @@ int _thread_autoinit_dummy_decl = 1;
|
||||
* No unresolved symbols for rtld.
|
||||
*/
|
||||
void
|
||||
__pthread_cxa_finalize(struct dl_phdr_info *a)
|
||||
__pthread_cxa_finalize(struct dl_phdr_info *a __unused)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ typedef unsigned char bool;
|
||||
extern size_t tls_last_offset;
|
||||
extern size_t tls_last_size;
|
||||
extern size_t tls_static_space;
|
||||
extern int tls_dtv_generation;
|
||||
extern Elf_Addr tls_dtv_generation;
|
||||
extern int tls_max_index;
|
||||
|
||||
extern int npagesizes;
|
||||
@ -151,7 +151,6 @@ typedef struct Struct_Obj_Entry {
|
||||
/* These items are computed by map_object() or by digest_phdr(). */
|
||||
caddr_t mapbase; /* Base address of mapped region */
|
||||
size_t mapsize; /* Size of mapped region in bytes */
|
||||
size_t textsize; /* Size of text segment in bytes */
|
||||
Elf_Addr vaddrbase; /* Base address in shared object file */
|
||||
caddr_t relocbase; /* Relocation constant = mapbase - vaddrbase */
|
||||
const Elf_Dyn *dynamic; /* Dynamic section */
|
||||
@ -211,12 +210,12 @@ typedef struct Struct_Obj_Entry {
|
||||
Elf32_Word maskwords_bm_gnu; /* Bloom filter words - 1 (bitmask) */
|
||||
Elf32_Word shift2_gnu; /* Bloom filter shift count */
|
||||
Elf32_Word dynsymcount; /* Total entries in dynsym table */
|
||||
Elf_Addr *bloom_gnu; /* Bloom filter used by GNU hash func */
|
||||
const Elf_Addr *bloom_gnu; /* Bloom filter used by GNU hash func */
|
||||
const Elf_Hashelt *buckets_gnu; /* GNU hash table bucket array */
|
||||
const Elf_Hashelt *chain_zero_gnu; /* GNU hash table value array (Zeroed) */
|
||||
|
||||
char *rpath; /* Search path specified in object */
|
||||
char *runpath; /* Search path with different priority */
|
||||
const char *rpath; /* Search path specified in object */
|
||||
const char *runpath; /* Search path with different priority */
|
||||
Needed_Entry *needed; /* Shared objects needed by this one (%) */
|
||||
Needed_Entry *needed_filtees;
|
||||
Needed_Entry *needed_aux_filtees;
|
||||
|
@ -184,7 +184,7 @@ thread_mask_clear(int mask)
|
||||
}
|
||||
|
||||
#define RTLD_LOCK_CNT 3
|
||||
struct rtld_lock {
|
||||
static struct rtld_lock {
|
||||
void *handle;
|
||||
int mask;
|
||||
} rtld_locks[RTLD_LOCK_CNT];
|
||||
|
@ -187,6 +187,7 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
||||
padc = '0';
|
||||
goto reswitch;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
for (n = 0;; ++fmt) {
|
||||
@ -324,6 +325,7 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
||||
goto handle_nosign;
|
||||
case 'X':
|
||||
upper = 1;
|
||||
/* FALLTHROUGH */
|
||||
case 'x':
|
||||
base = 16;
|
||||
goto handle_nosign;
|
||||
|
@ -256,7 +256,7 @@ do_copy_relocations(Obj_Entry *dstobj)
|
||||
|
||||
assert(dstobj->mainprog); /* COPY relocations are invalid elsewhere */
|
||||
|
||||
relalim = (const Elf_Rela *)((caddr_t)dstobj->rela + dstobj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)dstobj->rela + dstobj->relasize);
|
||||
for (rela = dstobj->rela; rela < relalim; rela++) {
|
||||
if (ELF_R_TYPE(rela->r_info) == R_SPARC_COPY) {
|
||||
dstaddr = (void *)(dstobj->relocbase + rela->r_offset);
|
||||
@ -316,7 +316,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
} else
|
||||
cache = NULL;
|
||||
|
||||
relalim = (const Elf_Rela *)((caddr_t)obj->rela + obj->relasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize);
|
||||
for (rela = obj->rela; rela < relalim; rela++) {
|
||||
if (reloc_nonplt_object(obj, rela, cache, flags, lockstate) < 0)
|
||||
goto done;
|
||||
@ -408,8 +408,8 @@ reloc_nonplt_object(Obj_Entry *obj, const Elf_Rela *rela, SymCache *cache,
|
||||
* of) static TLS in dynamically loaded modules. If
|
||||
* we run out of space, we generate an error.
|
||||
*/
|
||||
if (!defobj->tls_done &&
|
||||
!allocate_tls_offset((Obj_Entry*)defobj)) {
|
||||
if (!defobj->tls_done && !allocate_tls_offset(
|
||||
__DECONST(Obj_Entry *, defobj))) {
|
||||
_rtld_error("%s: No space available for "
|
||||
"static Thread Local Storage", obj->path);
|
||||
return (-1);
|
||||
@ -487,7 +487,7 @@ reloc_nonplt_object(Obj_Entry *obj, const Elf_Rela *rela, SymCache *cache,
|
||||
}
|
||||
|
||||
int
|
||||
reloc_plt(Obj_Entry *obj)
|
||||
reloc_plt(Obj_Entry *obj __unused)
|
||||
{
|
||||
#if 0
|
||||
const Obj_Entry *defobj;
|
||||
@ -542,7 +542,8 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
Elf_Addr *where;
|
||||
Elf_Addr target;
|
||||
|
||||
relalim = (const Elf_Rela *)((char *)obj->pltrela + obj->pltrelasize);
|
||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela +
|
||||
obj->pltrelasize);
|
||||
for (rela = obj->pltrela; rela < relalim; rela++) {
|
||||
assert(ELF64_R_TYPE_ID(rela->r_info) == R_SPARC_JMP_SLOT);
|
||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
|
||||
@ -551,14 +552,16 @@ reloc_jmpslots(Obj_Entry *obj, int flags, RtldLockState *lockstate)
|
||||
if (def == NULL)
|
||||
return -1;
|
||||
target = (Elf_Addr)(defobj->relocbase + def->st_value);
|
||||
reloc_jmpslot(where, target, defobj, obj, (Elf_Rel *)rela);
|
||||
reloc_jmpslot(where, target, defobj, obj,
|
||||
(const Elf_Rel *)rela);
|
||||
}
|
||||
obj->jmpslots_done = true;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
reloc_iresolve(Obj_Entry *obj __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -566,8 +569,8 @@ reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate)
|
||||
}
|
||||
|
||||
int
|
||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
struct Struct_RtldLockState *lockstate)
|
||||
reloc_gnu_ifunc(Obj_Entry *obj __unused, int flags __unused,
|
||||
struct Struct_RtldLockState *lockstate __unused)
|
||||
{
|
||||
|
||||
/* XXX not implemented */
|
||||
@ -575,7 +578,7 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags,
|
||||
}
|
||||
|
||||
Elf_Addr
|
||||
reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj __unused,
|
||||
const Obj_Entry *refobj, const Elf_Rel *rel)
|
||||
{
|
||||
const Elf_Rela *rela = (const Elf_Rela *)rel;
|
||||
@ -612,7 +615,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
*/
|
||||
where = (Elf_Word *)wherep;
|
||||
offset = ((Elf_Addr)where) - target;
|
||||
if (offset <= (1L<<20) && offset >= -(1L<<20)) {
|
||||
if (offset <= (1UL<<20) && offset >= -(1UL<<20)) {
|
||||
/*
|
||||
* We're within 1MB -- we can use a direct branch
|
||||
* instruction.
|
||||
@ -631,7 +634,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
*/
|
||||
where[1] = BAA | ((offset >> 2) &0x3fffff);
|
||||
flush(where, 4);
|
||||
} else if (target >= 0 && target < (1L<<32)) {
|
||||
} else if (target < (1UL<<32)) {
|
||||
/*
|
||||
* We're within 32-bits of address zero.
|
||||
*
|
||||
@ -651,7 +654,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
flush(where, 8);
|
||||
where[1] = SETHI | HIVAL(target, 10);
|
||||
flush(where, 4);
|
||||
} else if (target <= 0 && target > -(1L<<32)) {
|
||||
} else if (target > -(1UL<<32)) {
|
||||
/*
|
||||
* We're within 32-bits of address -1.
|
||||
*
|
||||
@ -673,7 +676,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
flush(where, 8);
|
||||
where[1] = SETHI | HIVAL(~target, 10);
|
||||
flush(where, 4);
|
||||
} else if (offset <= (1L<<32) && offset >= -((1L<<32) - 4)) {
|
||||
} else if (offset <= (1UL<<32) && offset >= -((1UL<<32) - 4)) {
|
||||
/*
|
||||
* We're within 32-bits -- we can use a direct call
|
||||
* insn
|
||||
@ -696,7 +699,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
flush(where, 8);
|
||||
where[1] = MOV71;
|
||||
flush(where, 4);
|
||||
} else if (offset >= 0 && offset < (1L<<44)) {
|
||||
} else if (offset < (1L<<44)) {
|
||||
/*
|
||||
* We're within 44 bits. We can generate this
|
||||
* pattern:
|
||||
@ -721,7 +724,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
|
||||
flush(where, 8);
|
||||
where[1] = SETHI | HIVAL(offset, 22);
|
||||
flush(where, 4);
|
||||
} else if (offset < 0 && offset > -(1L<<44)) {
|
||||
} else if (offset > -(1UL<<44)) {
|
||||
/*
|
||||
* We're within 44 bits. We can generate this
|
||||
* pattern:
|
||||
|
@ -174,6 +174,7 @@ reldoc:
|
||||
cd ${DOCDIR}/en_US.ISO8859-1/htdocs/releases/${REVISION}R && \
|
||||
env MAN4DIR=${WORLDDIR}/share/man/man4 \
|
||||
SVN=${SVN} \
|
||||
_BRANCH=${BRANCH} \
|
||||
${MAKE} all install clean "FORMATS=html txt" \
|
||||
INSTALL_COMPRESSED='' URLS_ABSOLUTE=YES DOCDIR=${.OBJDIR}/rdoc \
|
||||
WEBDIR=${DOCDIR} DESTDIR=${.OBJDIR}/rdoc
|
||||
|
@ -287,9 +287,9 @@ extra_chroot_setup() {
|
||||
PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}"
|
||||
PBUILD_FLAGS="${PBUILD_FLAGS} WRKDIRPREFIX=/tmp/ports"
|
||||
PBUILD_FLAGS="${PBUILD_FLAGS} DISTDIR=/tmp/distfiles"
|
||||
chroot ${CHROOTDIR} env ${PBUILD_FLAGS} make -C \
|
||||
chroot ${CHROOTDIR} env ${PBUILD_FLAGS} \
|
||||
OPTIONS_UNSET="AVAHI FOP IGOR" make -C \
|
||||
/usr/ports/textproc/docproj \
|
||||
OPTIONS_UNSET="FOP IGOR" \
|
||||
FORCE_PKG_REGISTER=1 \
|
||||
install clean distclean
|
||||
fi
|
||||
|
@ -116,6 +116,7 @@ CRUNCH_PROGS_sbin+= routed rtquery
|
||||
.endif
|
||||
|
||||
.if ${MK_ZFS} != "no"
|
||||
CRUNCH_PROGS_sbin+= bectl
|
||||
CRUNCH_PROGS_sbin+= zfs
|
||||
CRUNCH_PROGS_sbin+= zpool
|
||||
CRUNCH_PROGS_usr.sbin+= zdb
|
||||
@ -127,6 +128,7 @@ CRUNCH_PROGS_usr.sbin+= zdb
|
||||
CRUNCH_LIBS+= -l80211 -lalias -lcam -lncursesw -ldevstat -lipsec -llzma
|
||||
.if ${MK_ZFS} != "no"
|
||||
CRUNCH_LIBS+= -lavl -lzpool -lzfs_core -lzfs -lnvpair -lpthread -luutil -lumem
|
||||
CRUNCH_LIBS+= -lbe
|
||||
.else
|
||||
# liblzma needs pthread
|
||||
CRUNCH_LIBS+= -lpthread
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user