Linux 是否将可执行文件打包到共享库中?

Linux 是否将可执行文件打包到共享库中?,linux,Linux,在调用所述库中的函数时,是否可以将可执行文件打包到共享库中: 解压缩可执行文件 通过fork 我问这个问题的原因是因为我最近遇到了一个情况,我的共享库是在一个“沙盒”环境中加载的(可能是基于chroot的),我真的很想为一个可执行文件生成一个单独的进程(松耦合) 实际上,最好的解决方案是只使用fork()而不使用exec——在fork()之后让子端调用另一个函数(然后在该函数完成后使用\u exit()退出) 实际上,最好的解决方案是只使用fork()而不使用exec——在fork()之后让

在调用所述库中的函数时,是否可以将可执行文件打包到共享库中:

  • 解压缩可执行文件
  • 通过
    fork

我问这个问题的原因是因为我最近遇到了一个情况,我的共享库是在一个“沙盒”环境中加载的(可能是基于chroot的),我真的很想为一个可执行文件生成一个单独的进程(松耦合)


实际上,最好的解决方案是只使用
fork()
而不使用
exec
——在
fork()
之后让子端调用另一个函数(然后在该函数完成后使用
\u exit()
退出)

实际上,最好的解决方案是只使用
fork()
而不使用
exec
——在
fork()
之后让子端调用另一个函数(然后在该函数完成后使用
\u exit()
退出)。

完全合理

static const char program[] = {
    0x7f, 0x45, 0x4c, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x43, 0x05, 0x02, 0x00, 0x03, 0x00, 0x1a, 0x00, 0x43, 0x05,
    0x1a, 0x00, 0x43, 0x05, 0x04, 0x00, 0x00, 0x00, 0xb9, 0x31, 0x00, 0x43,
    0x05, 0xb2, 0x0d, 0xcd, 0x80, 0x25, 0x20, 0x00, 0x01, 0x00, 0x93, 0xcd,
    0x80, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c,
    0x64, 0x0a
};

void hello(void) {
    int fd;
    pid_t child;
    char name[1024];
    char *tmp = getenv("TEMP") ?: getenv("TMP") ?: "/tmp";
    if (strlen(tmp) > sizeof(name) - 8) return;
    sprintf(name, "%s/XXXXXX", tmp);
    fd = mkstemp(name);
    if (fd == -1) return;
    if (write(fd, program, sizeof(program)) < sizeof(program)) {
        close(fd);
        unlink(name);
        return;
    }
    fchmod(fd, 0700);
    close(fd);
    (child = fork()) ? waitpid(child, 0, 0) : execl(name, name);
    unlink(name);
}
静态常量字符程序[]={
0x7f、0x45、0x4c、0x46、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、,
0x00,0x00,0x43,0x05,0x02,0x00,0x03,0x00,0x1a,0x00,0x43,0x05,
0x1a、0x00、0x43、0x05、0x04、0x00、0x00、0x00、0xb9、0x31、0x00、0x43,
0x05、0xb2、0x0d、0xcd、0x80、0x25、0x20、0x00、0x01、0x00、0x93、0xcd、,
0x80、0x68、0x65、0x6c、0x6c、0x6f、0x2c、0x20、0x77、0x6f、0x72、0x6c,
0x64,0x0a
};
void你好(void){
int-fd;
pid_t儿童;
字符名[1024];
char*tmp=getenv(“TEMP”)?:getenv(“tmp”)?:“/tmp”;
if(strlen(tmp)>sizeof(name)-8)返回;
sprintf(名称为“%s/XXXXXX”,tmp);
fd=mkstemp(名称);
如果(fd==-1)返回;
if(写入(fd,程序,sizeof(程序))
在Linux x86或兼容系统上运行时,此函数将在屏幕上打印“hello,world”

不过,我绝对不建议这样做。如果您想要一个单独的二进制文件,只需提供一个单独的二进制文件,并要求它与您的库一起安装在沙箱中。

完全合理

static const char program[] = {
    0x7f, 0x45, 0x4c, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x43, 0x05, 0x02, 0x00, 0x03, 0x00, 0x1a, 0x00, 0x43, 0x05,
    0x1a, 0x00, 0x43, 0x05, 0x04, 0x00, 0x00, 0x00, 0xb9, 0x31, 0x00, 0x43,
    0x05, 0xb2, 0x0d, 0xcd, 0x80, 0x25, 0x20, 0x00, 0x01, 0x00, 0x93, 0xcd,
    0x80, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c,
    0x64, 0x0a
};

void hello(void) {
    int fd;
    pid_t child;
    char name[1024];
    char *tmp = getenv("TEMP") ?: getenv("TMP") ?: "/tmp";
    if (strlen(tmp) > sizeof(name) - 8) return;
    sprintf(name, "%s/XXXXXX", tmp);
    fd = mkstemp(name);
    if (fd == -1) return;
    if (write(fd, program, sizeof(program)) < sizeof(program)) {
        close(fd);
        unlink(name);
        return;
    }
    fchmod(fd, 0700);
    close(fd);
    (child = fork()) ? waitpid(child, 0, 0) : execl(name, name);
    unlink(name);
}
静态常量字符程序[]={
0x7f、0x45、0x4c、0x46、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、,
0x00,0x00,0x43,0x05,0x02,0x00,0x03,0x00,0x1a,0x00,0x43,0x05,
0x1a、0x00、0x43、0x05、0x04、0x00、0x00、0x00、0xb9、0x31、0x00、0x43,
0x05、0xb2、0x0d、0xcd、0x80、0x25、0x20、0x00、0x01、0x00、0x93、0xcd、,
0x80、0x68、0x65、0x6c、0x6c、0x6f、0x2c、0x20、0x77、0x6f、0x72、0x6c,
0x64,0x0a
};
void你好(void){
int-fd;
pid_t儿童;
字符名[1024];
char*tmp=getenv(“TEMP”)?:getenv(“tmp”)?:“/tmp”;
if(strlen(tmp)>sizeof(name)-8)返回;
sprintf(名称为“%s/XXXXXX”,tmp);
fd=mkstemp(名称);
如果(fd==-1)返回;
if(写入(fd,程序,sizeof(程序))
在Linux x86或兼容系统上运行时,此函数将在屏幕上打印“hello,world”


不过,我绝对不建议这样做。如果您想要一个单独的二进制文件,只需提供一个单独的二进制文件,并要求它与您的库一起安装在沙箱中。

如果我没有访问此类目录的权限,如何?(我已经实现了一个基于
fork
+函数的解决方案)然后它就不能真正实现了——但这几乎是因为这样做没有意义(
exec
将当前正在执行的映像替换为文件中的映像-另一方面,将当前正在执行的映像替换为其自身的一部分是毫无意义的,因为您可以直接调用该部分)。如果我没有访问该目录的权限如何?(我已经实现了一个基于
fork
+函数的解决方案)然后它就不能真正实现了——但这几乎是因为这样做没有意义(
exec
将当前正在执行的图像替换为文件中的图像-另一方面,将当前正在执行的图像替换为其自身的一部分是毫无意义的,因为您可以直接调用该部分)。