如何编译C文件但限制库使用?

Ran*_*ber 1 c unix gcc compilation

我正在使用unix服务器.

我从我的客户端获取ac文件作为输入,我编译.

c文件应该是非常基本的,并且只包含来自stdio,stdlib,math,string的函数.

GCC编译器中是否有任何标志不允许使用任何其他库,并且在使用其他库时会抛出编译错误?

如果有一个不涉及GCC的解决方案,它也可能是好的,但我不想检查文件.

谢谢.

Dan*_*ger 6

限制库(包括编译时的头文件和链接时的库链接)不会阻止不受信任的代码直接调用危险(如安全相关的)内核系统调用.这可以通过不受信任的代码来完成,例如通过使用内联汇编或shellcode/exploit技术,例如通过故意覆盖堆栈上的返回地址以指向包含shellcode的字符串.

话虽如此,您可以使用-nostdlib -nodefaultlibs链接器选项来阻止链接到库.但是,这仍然只允许您拥有整个libc,或者不包含任何libc.你不能有选择地只链接到libc的一部分(比如说,有printf()但没有system()).

只允许某些包含也不是非常有效:代码只能复制包含文件中的声明,而不是包含某些标题以绕过限制只允许特定#include语句.例:

int system(const char *);
int main() {
    return system("uname -a");
}
Run Code Online (Sandbox Code Playgroud)

如果它必须是安全的,您应该考虑在运行时沙箱化代码,而不是试图防止编译不安全的代码.