----- On Jun 14, 2019, at 12:06 PM, Florian Weimer fweimer@xxxxxxxxxx wrote: > * Mathieu Desnoyers: > >> ----- On Jun 12, 2019, at 4:00 PM, Mathieu Desnoyers >> mathieu.desnoyers@xxxxxxxxxxxx wrote: >> >>> ----- On Jun 10, 2019, at 4:43 PM, carlos carlos@xxxxxxxxxx wrote: >>> >>>> On 6/6/19 7:57 AM, Florian Weimer wrote: >>>>> Let me ask the key question again: Does it matter if code observes the >>>>> rseq area first without kernel support, and then with kernel support? >>>>> If we don't expect any problems immediately, we do not need to worry >>>>> much about the constructor ordering right now. I expect that over time, >>>>> fixing this properly will become easier. >>>> >>>> I just wanted to chime in and say that splitting this into: >>>> >>>> * Ownership (__rseq_handled) >>>> >>>> * Initialization (__rseq_abi) >>>> >>>> Makes sense to me. >>>> >>>> I agree we need an answer to this question of ownership but not yet >>>> initialized, to owned and initialized. >>>> >>>> I like the idea of having __rseq_handled in ld.so. >>> >>> Very good, so I'll implement this approach. Sorry for the delayed >>> feedback, I am traveling this week. >> >> I had issues with cases where application or LD_PRELOAD library also >> define the __rseq_handled symbol. They appear not to see the same >> address as the one initialized by ld.so. > > What exactly did you do? How did you determine the addresses? How is > __rseq_handled defined in ld.so? The easiest way to answer these questions is through links to my github dev branch: https://github.com/compudj/glibc-dev/tree/glibc-rseq specifically this commit: https://github.com/compudj/glibc-dev/commit/c49a286497d065a7fc00aafd846e6edce14f97fc and this attempt at using GL(): https://github.com/compudj/glibc-dev/commit/8a02acfbb6943672bfa36b4fc6f61905ee4fa180 My test programs are: * a.c: #include <stdio.h> #include <linux/rseq.h> extern __thread struct rseq __rseq_abi __attribute__ ((tls_model ("initial-exec")));/* = { .cpu_id = -1, };*/ extern int __rseq_handled; int main() { fprintf(stderr, "__rseq_handled main: %d %p\n", __rseq_handled, &__rseq_handled); fprintf(stderr, "__rseq_abi.cpu_id main: %d %p\n", __rseq_abi.cpu_id, &__rseq_abi); return 0; } * s.c: #include <stdio.h> #include <linux/rseq.h> #if 0 __thread struct rseq __rseq_abi __attribute__ ((tls_model ("initial-exec"))) = { .cpu_id = -1, }; int __rseq_handled; #else extern __thread struct rseq __rseq_abi __attribute__ ((tls_model ("initial-exec"))); extern int __rseq_handled; #endif void __attribute__((constructor)) myinit(void) { fprintf(stderr, "__rseq_handled s.so: %d %p\n", __rseq_handled, &__rseq_handled); fprintf(stderr, "__rseq_abi.cpu_id s.so: %d %p\n", __rseq_abi.cpu_id, &__rseq_abi); } * Makefile: LIBCPATH=/home/efficios/glibc-test/lib KERNEL_HEADERS=/home/efficios/git/linux-percpu-dev/usr/include CFLAGS=-I${KERNEL_HEADERS} -L${LIBCPATH} -Wl,--rpath=${LIBCPATH} -Wl,--dynamic-linker=${LIBCPATH}/ld-linux-x86-64.so.2 all: gcc ${CFLAGS} -o a a.c gcc ${CFLAGS} -shared -fPIC -o s.so s.c Thanks, Mathieu > > Thanks, > Florian -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com