необходимо пропустить аргументы команды внутри библиотеки

Usando GNU awk, buscando campos con solo números:

awk -v FPAT='[0-9]+' -v OFS=',' '{$2=$2 "/" $3; printf "%s,%s,",$1,$2; for(i=4;i<=NF;i++){ printf "%s%s",$i,i==NF?ORS:OFS}}'  <<< "|Ordernum=8921|mn=03|yr=20|id=869|Name=1|Street=2|City=3|State=4|Zip=5|Country=6|"

FPATdescribe cómo se ve el patrón. En este caso, se compone de número solamente.

OFSes el separador de campo de salida que permite formatear con ,.

El segundo campo se reconstruye con el tercero. Todos los demás se imprimen tal cual.

1
07.05.2019, 21:38
2 ответа

Возможно, я нашел свой собственный ответ:

https://stackoverflow.com/questions/36998143/alternative-way-to-obtain-argc-and-argv-of-a-process

__attribute__((constructor)) void stuff(int argc, char **argv)
{
    for (int i=0; i<argc; i++) {
        printf("%s: argv[%d] = '%s'\n", __FUNCTION__, i, argv[i]);
    }
}

Конечно, остается проблема с пропуском аргументов, IE, вы можете просмотреть аргументы, но основная ()программа завершится ошибкой, когда обнаружит, что аргументы вашей библиотеки смешаны со своими собственными.

0
27.01.2020, 23:41

В Linux[1] вы можете переопределить __libc_start_main()функцию (оболочку, которая вызывает main()функцию )из вашей библиотеки. Вы можете сделать это несколько раз.

Пример:

#define _GNU_SOURCE     /* for RTLD_NEXT */
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include <err.h>
#ifdef __UCLIBC__
#define __libc_start_main       __uClibc_main
#endif
#define STR_(s) #s
#define STR(s)  STR_(s)
int __libc_start_main(
        int (*main)(int,char**,char**), int ac, char **av,
        int (*init)(int,char**,char**), void (*fini)(void),
        void (*rtld_fini)(void), void *stack_end)
{
        typeof(__libc_start_main) *real_lsm;
        if(*(void**)&real_lsm = dlsym(RTLD_NEXT, STR(__libc_start_main)))
                return real_lsm(main, ac - 1, av + 1, init, fini, rtld_fini, stack_end);
        else
                errx(1, "BUG: dlsym: %s", dlerror());
}
$ cc -fPIC -shared -Wall -W -Wno-parentheses skip.c -o skip1.so -ldl
$ cc -fPIC -shared -Wall -W -Wno-parentheses skip.c -o skip2.so -ldl
$ LD_PRELOAD="./skip1.so./skip2.so" /bin/echo a b c d
c d

Это также работает, если вы явно связываете программу с библиотеками skip1.soи т. д. Вы даже можете execve()создать совершенно другую программу с совершенно другими аргументами.

[1] Это также работает с musl, хотя его __libc_start_mainне принимает аргумент rtld_fini. В uclibc эквивалентной функцией является __uClibc_main.

1
27.01.2020, 23:41

Теги

Похожие вопросы