Статическая библиотека, созданная с помощью ar, имеет отметку времени с разрешением 1 с.

Я создаю статическую библиотеку из одного объектного файла. Сгенерированный файл .a имеет метку времени с разрешением в одну секунду (усеченную до более ранней секунды), а файл .o — нет.

По сути, это делает файл .a более старым, чем файл .o, и библиотека перестраивается в следующий раз, когда я make.

Я слышал, что такие проблемы могут быть на Mac, но я использую Ubuntu, x64.

Пытаясь понять, что происходит, я сделал более простой проект, чтобы показать поведение. Но в этом случае все работает так, как я ожидаю:

gauthier@sobel:~/tmp/ar_test $ ls
hello.c  makefile
gauthier@sobel:~/tmp/ar_test $ make
gcc -c hello.c -o hello.o -g -Wall -Wextra -Werror -O3 -lrt
ar -cvq hello.a hello.o
a - hello.o
gauthier@sobel:~/tmp/ar_test $ ls --full-time
total 28
-rw-rw-r-- 1 gauthier gauthier 11940 2014-11-21 09:55:22.131715135 +0100 hello.a
-rw-rw-r-- 1 gauthier gauthier    81 2014-11-20 15:14:34.419613737 +0100 hello.c
-rw-rw-r-- 1 gauthier gauthier  5864 2014-11-21 09:55:22.131715135 +0100 hello.o
-rw-rw-r-- 1 gauthier gauthier   254 2014-11-20 15:17:47.533185970 +0100 makefile
gauthier@sobel:~/tmp/ar_test $ make
make: Nothing to be done for `all'.

Там все работает, hello.a имеет метку времени, равную hello.o.

Вернемся к моему исходному проекту. Я не могу понять, в чем разница, но временная метка для библиотеки заполнена нулями после секунд:

gauthier@sobel:~/code/myproj (master) $ ls
makefile  README.md  test  myproj.c  myproj.h
gauthier@sobel:~/code/myproj (master) $ make
gcc -c myproj.c -o myproj.o -g -Wall -Wextra -Werror -O3 -lrt -pthread
ar -cvqU libmyproj.a myproj.o
a - myproj.o
gauthier@sobel:~/code/myproj (master) $ ls --full-time
total 64
-rw-rw-r-- 1 gauthier gauthier 18852 2014-11-21 10:03:59.000000000 +0100 libmyproj.a
-rw-rw-r-- 1 gauthier gauthier  1363 2014-11-21 09:53:09.397383831 +0100 makefile
-rw-rw-r-- 1 gauthier gauthier   106 2014-11-20 13:49:15.299969786 +0100 README.md
drwxrwxr-x 2 gauthier gauthier  4096 2014-11-20 13:49:15.303969736 +0100 test
-rw-rw-r-- 1 gauthier gauthier  4741 2014-11-20 13:49:15.303969736 +0100 myproj.c
-rw-rw-r-- 1 gauthier gauthier  3584 2014-11-20 15:05:10.554702000 +0100 myproj.h
-rw-rw-r-- 1 gauthier gauthier 18648 2014-11-21 10:03:59.861206394 +0100 myproj.o
gauthier@sobel:~/code/myproj (master) $ make
ar -cvqU libmyproj.a myproj.o
a - myproj.o

Обратите внимание на отметку времени libmyproj.a: 10:03:59.000000000.

Я пробовал оба варианта -U и -D до ar без av (не то чтобы я действительно думал, что это должно иметь значение).

После дальнейшего изучения похоже, что проблема зависит от того, в каком каталоге находятся файлы:

  • Если я скопирую ~/code/myproj/myproj.o в тестовый каталог ~/tmp/ar_test/myproj.o и запущу ar -cvq libmyproj.a myproj.o там, отметка времени будет правильной.

  • Если я скопирую ~/tmp/ar_test/hello.o в расположение исходного проекта ~/code/myproj/hello.o и запущу там ar -cvq libhello.a hello.o, отметка времени будет неверной.

Другими словами: ar генерирует усеченные метки времени, когда я нахожусь в ~/code/myproj, но не когда я нахожусь в ~/tmp/ar_test.

Что может заставить библиотеку потерять нижнюю часть метки времени, в зависимости от того, в каком каталоге я нахожусь?


person Gauthier    schedule 21.11.2014    source источник
comment
Может ли это быть проблемой файловой системы? На каких файловых системах работают ~/tmp и ~/code? Какие mount опции используются?   -  person Axel    schedule 21.11.2014
comment
PS: В качестве быстрого и грязного исправления попробуйте добавить команду touch myproj.o после ar.   -  person Axel    schedule 21.11.2014
comment
Да! Я думаю, вы можете быть правы! ~/code относится к типу fuse.encfs. ~/tmp это ext4. Но почему другие файлы получают метки времени с высоким разрешением, а файлы .a — нет?   -  person Gauthier    schedule 21.11.2014


Ответы (1)


Благодаря @Axel проблема решена. Я пишу решение здесь и надеюсь, что это может спасти кого-то еще от поиска здесь своего пути.

~/code (где временные метки были усечены) была файловой системой типа fuse.encfs. Каким-то образом ar не может создать полную метку времени в файловой системе этого типа. Это странно, так как другие файлы получают правильные метки времени (например, gcc генерирует целые метки времени для объектных файлов).

Мое решение состояло в том, чтобы работать в ext4 fs и иметь дело с шифрованием (что является точкой encfs) другим способом.

person Gauthier    schedule 21.11.2014