我制作了一段代码,其中包含一个动态库(lib.c)和一个主可执行文件(main.c).在这两个文件,我定义一个名为一个全局变量:int global.不是很聪明,但这不是问题.
当我编译动态库时,该-fPIC选项似乎是强制性的:
gcc lib.c -fPIC -shared -o lib.so
Run Code Online (Sandbox Code Playgroud)
否则我得到:
/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)
当我编译可执行文件时,它不是.
gcc main.c -fPIC -ldl
gcc main.c -ldl
Run Code Online (Sandbox Code Playgroud)
两者都有效,但有不同的行为,我无法解释,是吗?:
使用-fPIC,main.c中的global和lib.c中的global是相同的变量:
global main: 23 (0x601050)
global lib: 23 (0x601050)
Run Code Online (Sandbox Code Playgroud)
没有-fPIC,lib.c中的global与main.c中的global不相关:
global main: 23 (0x601048)
global lib: 0 (0x7f7742e64028)
Run Code Online (Sandbox Code Playgroud)
这是来源:
lib.c
#include <stdio.h>
#include <stdlib.h>
int global;
int f_one() {
printf("global lib: %d (%p)\n", global, &global); …Run Code Online (Sandbox Code Playgroud) 我需要将 monaco-editor 与纯客户端解决方案集成在网页上,并且无需使用 Node.js。
我在 @SimperT How to Implement monaco-editor on a web without Nodejs and Electron找到了一个很好的答案,但他的存储库已经过时了(js 是一个狂野的世界),而且我有一个额外的限制,即文件只能在本地提供(没有 CDN) ,其用于 Intranet,无需外部访问)。
所以,这有点像瓶子里的信息,但如果有人有关于如何做到这一点的线索或指示,我会洗耳恭听......(如果我想出解决方案,我会将其发布在这里)
它是一个错误还是一个功能?
当我使用os.mkdir(idem with pathlib.Path.mkdir) 和显式模式创建目录时,创建的目录的权限不适合。如果我os.chmod再次强制执行,它会起作用......
>>> import sys, os
>>> sys.version
'3.4.3 (default, Feb 27 2015, 18:13:37) \n[GCC 4.4.5]'
>>> os.mkdir('truite', mode=0o2770)
>>> oct(os.stat('truite').st_mode)
'0o40750'
>>> os.chmod('truite', 0o2770)
>>> oct(os.stat('truite').st_mode)
'0o42770'
Run Code Online (Sandbox Code Playgroud)
因为我希望能够与父母和模式 o2770 创建一个目录,这里是代码(pth是一个pathlib.Path对象):
def make_shared_dir(pth) :
if not pth.parent.is_dir() :
make_shared_dir(pth.parent)
if not pth.is_dir() :
pth.mkdir()
pth.chmod(0o2770)
Run Code Online (Sandbox Code Playgroud) 我正在寻找从python(3)调用shell命令的最安全和最方便的方法.这里是ps到pdf的转换:
gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="${pdf_file}" "${ps_file}"
Run Code Online (Sandbox Code Playgroud)
我使用subprocess,shlex并避免shell=True.但我发现结果命令不一致:
cmd = ['gs', '-dBATCH', '-dNOPAUSE', '-sDEVICE=pdfwrite', '-sOutputFile={0}'.format(pdf_filename), ps_filename]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?!subprocess.call()语法看起来很干净,空格分隔的参数,在其他地方看起来一团糟.
在以下之间调用subprocess.call(cmd)(在python级别,即转义,注入保护,引用等)时有什么区别:
cmd = ['do', '--something', arg]
cmd = ['do', '--someting {0}'.format(arg)]
Run Code Online (Sandbox Code Playgroud)
如果没有,这也是一个很好的方法吗?
cmd = ['gs', '-dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile={0} {1}'.format(pdf_filename, ps_filename)]
Run Code Online (Sandbox Code Playgroud)
另一个不一致的例子:
hg merge -r 3 将会 cmd = ['hg', 'merge', '-r', revision_id]
hg merge --rev=3 将会 cmd = ['hg', 'merge', '--rev={0}'.format(revision_id)]
尽管如此,发送相同的参数有两种方法.